package org.eclipse.uml2.diagram.common.async;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
import org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.uml2.diagram.common.Messages;
/**
* The U2T specific version of DeleteFromDiagramAction that respects the
* semi-synchronized diagram mode of U2T structure diagrams.
*
* We would prefer to extend org.eclipse.gmf.runtime.diagram.ui.actions.internal.DeleteFromDiagramAction
* but can't do it due to plugin exporting limitations
*/
public class DeleteFromDiagramAction extends DiagramAction {
public DeleteFromDiagramAction(IWorkbenchPage workbenchPage) {
super(workbenchPage);
}
/**
* Mimic the appearance of default GMF DeleteFromDiagramAction
*/
public void init() {
super.init();
setId(ActionIds.ACTION_DELETE_FROM_DIAGRAM);
setText(Messages.DeleteFromDiagramAction_action_delete_from_diagram);
setToolTipText(Messages.DeleteFromDiagramAction_action_tooltip_delete_from_diagram);
ISharedImages workbenchImages = PlatformUI.getWorkbench().getSharedImages();
setHoverImageDescriptor(workbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
setImageDescriptor(workbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
setDisabledImageDescriptor(workbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
}
protected boolean isSelectionListener() {
return true;
}
protected Request createTargetRequest() {
AsyncDiagramDeleteRequest deleteReq = new AsyncDiagramDeleteRequest();
deleteReq.setKind(AsyncDiagramDeleteRequest.Kind.NOTATION_ONLY);
return deleteReq;
}
/**
* In addition to default GMF DeleteFromDiagramAction behavior,
* we want to switch container into unsynchronized mode first.
* @return a command to execute
*/
protected Command getCommand() {
@SuppressWarnings("unchecked")
List<IGraphicalEditPart> objects = createOperationSet();
if (objects.isEmpty()) {
return null;
}
for (Object next : objects) {
if (next instanceof ConnectionEditPart) {
//connections are sync'ed in U2T
return null;
}
if (next instanceof DiagramEditPart) {
return null;
}
}
CompoundCommand result = new CompoundCommand(getLabel());
for (IGraphicalEditPart next : objects) {
result.add(next.getCommand(getTargetRequest()));
}
return result;
}
@SuppressWarnings("unchecked")
protected List createOperationSet() {
List selection = getSelectedObjects();
if (selection.isEmpty() || !(selection.get(0) instanceof IGraphicalEditPart)) {
return Collections.emptyList();
}
List<IGraphicalEditPart> result = new LinkedList<IGraphicalEditPart>();
for (Object next : selection) {
if (next instanceof IGraphicalEditPart) {
result.add((IGraphicalEditPart) next);
}
}
return result;
}
}