/******************************************************************************* | |
* 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 2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* 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)); | |
} | |
} | |
} |