blob: c124ff8b3c4ae0bac424e58452c27bac4f213c9d [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 324859 - Need Undo/Redo support for Non-EMF based domain objects
* 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 java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.graphiti.features.IAddFeature;
import org.eclipse.graphiti.features.IFeatureAndContext;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IAddContext;
import org.eclipse.graphiti.features.context.impl.AddContext;
import org.eclipse.graphiti.internal.DefaultFeatureAndContext;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.ui.platform.IConfigurationProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
/**
* @noinstantiate This class is not intended to be instantiated by clients.
* @noextend This class is not intended to be subclassed by clients.
*/
public class AddModelObjectCommand extends AbstractCommand {
private List<AddContext> contextList; // contains IAddContext
public AddModelObjectCommand(IConfigurationProvider configurationProvider, ContainerShape parent, ISelection sel, Rectangle rectangle) {
this(configurationProvider, parent, sel, rectangle, null);
}
public AddModelObjectCommand(IConfigurationProvider configurationProvider, ContainerShape parent, ISelection sel, Rectangle rectangle,
Connection connection) {
super(configurationProvider);
IStructuredSelection s = (IStructuredSelection) sel;
if (s == null) {
s = StructuredSelection.EMPTY;
}
contextList = new ArrayList<AddContext>();
int x = rectangle.x;
int y = rectangle.y;
for (Iterator<?> iter = s.iterator(); iter.hasNext();) {
Object next = iter.next();
if (next instanceof IAdaptable) {
IAdaptable adaptable = (IAdaptable) next;
Object adapter = adaptable.getAdapter(EObject.class);
if (adapter instanceof EObject) {
next = adapter;
}
}
AddContext ctx = new AddContext();
ctx.setNewObject(next);
ctx.setTargetContainer(parent);
ctx.setLocation(x, y);
ctx.setTargetConnection(connection);
contextList.add(ctx);
x += 10;
y += 10;
}
}
@Override
public boolean canExecute() {
IFeatureProvider featureProvider = getFeatureProvider();
if (featureProvider != null && contextList.size() > 0) {
// try to find an add-feature for each object in the selection
for (Iterator<AddContext> iter = contextList.iterator(); iter.hasNext();) {
IAddContext ctx = iter.next();
IAddFeature f = featureProvider.getAddFeature(ctx);
if (f == null) {
return false;
} else {
boolean canAdd = f.canAdd(ctx);
if (canAdd == true) {
return true;
}
}
}
// return false;
}
return false;
}
@Override
public void execute() {
for (Iterator<AddContext> iter = contextList.iterator(); iter.hasNext();) {
IAddContext ctx = iter.next();
getFeatureProvider().addIfPossible(ctx);
}
}
@Override
public boolean canUndo() {
// The operation can be undone if all the features that used to add can
// be undone
boolean undoable = true;
for (final IFeatureAndContext fc : getFeaturesAndContexts()) {
undoable = undoable && fc.getFeature().canUndo(fc.getContext());
}
return undoable;
}
public IFeatureAndContext[] getFeaturesAndContexts() {
List<IFeatureAndContext> features = new ArrayList<IFeatureAndContext>();
IFeatureProvider featureProvider = getFeatureProvider();
if (featureProvider != null && contextList.size() > 0) {
// try to find an add-feature for each object in the selection
for (Iterator<AddContext> iter = contextList.iterator(); iter.hasNext();) {
IAddContext ctx = iter.next();
IAddFeature f = featureProvider.getAddFeature(ctx);
if (f != null && f.canAdd(ctx)) {
DefaultFeatureAndContext dfac = new DefaultFeatureAndContext(f, ctx);
features.add(dfac);
}
}
}
return features.toArray(new IFeatureAndContext[features.size()]);
}
}