blob: 1c5914bdd2d2ee6c739a4934fb7b4f97b45e9176 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.actions;
/*******************************************************************************
* A newer version of DeleteAction
*
* This version customizes the selection behavior after the delete has happened
* For example, we want to select a sibling after a particular object has been
* deleted as a usability enhancement.
*
* This version customizes the label behavior of the DeleteAction.
*
*******************************************************************************/
import org.eclipse.bpel.model.Link;
import org.eclipse.bpel.ui.BPELEditor;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.adapters.IContainer;
import org.eclipse.bpel.ui.commands.CompoundCommand;
import org.eclipse.bpel.ui.commands.DeleteChildCommand;
import org.eclipse.bpel.ui.commands.DeleteLinkCommand;
import org.eclipse.bpel.ui.commands.RestoreSelectionCommand;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.UnexecutableCommand;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
/**
* An action to delete selected objects.
*/
public class BPELDeleteAction extends EditAction {
public final static String ID = "BPELDeleteAction"; //$NON-NLS-1$
/**
* Brand new Delete Action.
* @param editor
*/
public BPELDeleteAction(IWorkbenchPart editor) {
super(editor);
}
/**
* Brand new DeleteAction.
*
* @param editor
* @param label
*/
public BPELDeleteAction(IWorkbenchPart editor, String label) {
super(editor);
setText(label);
}
@Override
protected void init() {
super.init();
setText(Messages.DeleteSelectedAction_Delete_1);
setToolTipText(Messages.DeleteSelectedAction_Delete_2);
setId(ID);
setImageDescriptor( PlatformUI.getWorkbench().getSharedImages().getImageDescriptor( ISharedImages.IMG_TOOL_DELETE ));
setDisabledImageDescriptor( PlatformUI.getWorkbench().getSharedImages().getImageDescriptor( ISharedImages.IMG_TOOL_DELETE_DISABLED ));
setEnabled(false);
}
@SuppressWarnings("boxing")
@Override
protected Command getCommand () {
if (this.fSelection.isEmpty()) {
return null ;
}
final BPELEditor bpelEditor = (BPELEditor) getWorkbenchPart();
CompoundCommand cmd = new CompoundCommand(Messages.DeleteSelectedAction_Delete_3);
// 1. Restore selection on undo/redo
cmd.add(new RestoreSelectionCommand(bpelEditor.getAdaptingSelectionProvider(), true, true));
// // workaround: deselect all the objects first,
// // avoiding the untimely notification which leads to an NPE.
// // TODO: is this still needed? might not be, with batched adapters
// cmd.add(new AbstractEditModelCommand() {
// public void execute() { bpelEditor.getAdaptingSelectionProvider().setSelection(StructuredSelection.EMPTY); }
// public Resource[] getResources() { return EMPTY_RESOURCE_ARRAY; }
// public Resource[] getModifiedResources() { return EMPTY_RESOURCE_ARRAY; }
// });
//
//
// 2. The delete commands.
for(EObject next : this.fSelection) {
if (next instanceof Link) {
cmd.add(new DeleteLinkCommand((Link)next));
} else {
cmd.add(new DeleteChildCommand(next));
}
}
int count = this.fSelection.size();
// override default label
if (count == 1) {
cmd.setLabel(cmd.getLabel());
} else if (count > 1) {
cmd.setLabel(NLS.bind(Messages.DeleteSelectedAction_Delete_Items_3, count));
} else {
// commandCount is 0
return UnexecutableCommand.INSTANCE;
}
return cmd;
}
/**
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
this.fSelection = trimSelection (this.fSelection);
Command cmd = getCommand();
if (cmd == null) {
return ;
}
EObject modelObject = this.fSelection.get(0);
EObject parent = modelObject.eContainer();
Object sibling = null;
IContainer<EObject> container = BPELUtil.adapt(parent, IContainer.class);
if (container != null) {
sibling = container.getNextSiblingChild(parent, modelObject);
}
execute( cmd );
BPELEditor bpelEditor = (BPELEditor) getWorkbenchPart();
// TODO: make sure setFocus() hack makes it into RestoreSelectionCommand
bpelEditor.setFocus();
if (sibling == null) {
bpelEditor.getAdaptingSelectionProvider().setSelection(StructuredSelection.EMPTY);
} else {
bpelEditor.getAdaptingSelectionProvider().setSelection(new StructuredSelection(sibling));
}
}
}