blob: 2058bd95033ad0a6f5bbe8c8bdc2b9704d638f89 [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 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;
import java.util.List;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.editparts.BPELEditPart;
import org.eclipse.bpel.ui.editparts.OutlineTreeEditPart;
import org.eclipse.bpel.ui.extensions.ActionDescriptor;
import org.eclipse.bpel.ui.extensions.BPELUIRegistry;
import org.eclipse.bpel.ui.factories.AbstractUIObjectFactory;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.IWorkbenchPart;
public class ChangeTypeAction extends SelectionAction {
protected AbstractUIObjectFactory factory;
public ChangeTypeAction(IWorkbenchPart editor, AbstractUIObjectFactory factory) {
this(editor, factory, factory.getTypeLabel());
}
public ChangeTypeAction(IWorkbenchPart editor, AbstractUIObjectFactory factory, String label) {
super(editor);
this.factory = factory;
setId(calculateID());
setText(label);
setToolTipText(NLS.bind(Messages.ChangeTypeAction_Change_type_to_1, (new Object[] { getText() })));
setImageDescriptor(factory.getSmallImageDescriptor());
}
protected String calculateID() {
return "changeType." + factory.getUniqueIdString(); //$NON-NLS-1$
}
@Override
protected boolean calculateEnabled() {
// TODO: there should be a better way that doesn't do as much work.
Command cmd = createReplaceInListCommand(getSelectedObjects());
if (cmd == null)
return false;
return cmd.canExecute();
}
private Command createReplaceInListCommand(List list) {
if (list.isEmpty())
return null;
//Command can only be executed on single selection
if (list.size() != 1)
return null;
if (!(list.get(0) instanceof BPELEditPart) &&
(!(list.get(0) instanceof OutlineTreeEditPart)))
return null;
EditPart editPart = (EditPart) list.get(0);
EClass editPartModelEClass = ((EObject)editPart.getModel()).eClass();
// should not offer to change to the same type - makes no sense
if (editPartModelEClass == factory.getModelType()) {
return null;
}
// A BPEL action can only be changed into another BPEL action.
boolean isToTypeAnAction = BPELUtil.isBPELAction(factory.getModelType());
boolean isFromTypeAnAction = BPELUtil.isBPELAction(editPartModelEClass);
if (isFromTypeAnAction || isToTypeAnAction) {
if (isFromTypeAnAction && isToTypeAnAction) {
ActionDescriptor desc = BPELUIRegistry.getInstance().getActionDescriptor(factory.getModelType());
if (desc != null) {
Object parent = editPart.getParent().getModel();
Object current = editPart.getModel();
Object newType = factory.createInstance();
return desc.getAction().getChangeActionTypeCommand(parent, current, newType);
}
}
return null;
}
//Use create request (handles using create factory to make the new element)
//But override the type to indicate change type, not adding new element
CreateRequest request = new CreateRequest();
request.setType("changeType"); //$NON-NLS-1$
request.setFactory(factory);
//Get the command from the edit part
return editPart.getCommand(request);
}
@Override
public void run() {
execute(createReplaceInListCommand(getSelectedObjects()));
}
}