| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2007 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 implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.diagram.core.actions; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.emf.common.command.BasicCommandStack; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; |
| import org.eclipse.emf.edit.domain.EditingDomain; |
| import org.eclipse.emf.edit.domain.IEditingDomainProvider; |
| import org.eclipse.emf.transaction.TransactionalEditingDomain; |
| import org.eclipse.epf.diagram.core.DiagramCoreResources; |
| import org.eclipse.epf.diagram.core.bridge.BridgeHelper; |
| import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor; |
| import org.eclipse.epf.library.edit.TngAdapterFactory; |
| import org.eclipse.epf.library.ui.actions.ProcessDeleteAction; |
| import org.eclipse.epf.uma.BreakdownElement; |
| import org.eclipse.epf.uma.MethodElement; |
| import org.eclipse.epf.uma.WorkProductDescriptor; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gef.RequestConstants; |
| import org.eclipse.gef.commands.Command; |
| import org.eclipse.gef.commands.UnexecutableCommand; |
| import org.eclipse.gef.requests.GroupRequest; |
| import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; |
| import org.eclipse.gmf.runtime.diagram.ui.actions.AbstractDeleteFromAction; |
| import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy; |
| import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy; |
| import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles; |
| import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper; |
| import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand; |
| import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest; |
| import org.eclipse.gmf.runtime.notation.Diagram; |
| import org.eclipse.gmf.runtime.notation.Node; |
| import org.eclipse.gmf.runtime.notation.View; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.swt.custom.BusyIndicator; |
| import org.eclipse.ui.ISharedImages; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.actions.ActionFactory; |
| |
| /** |
| * Replaces the default the Delete from Model and Delete from Diagram actions of GMF. |
| * Delete the diagram element and its associated diagram and references. |
| * @author Shashidhar Kannoori. |
| */ |
| public class DeleteElementAction extends AbstractDeleteFromAction { |
| |
| boolean removeModel = true; |
| /** the target request */ |
| private Request secondaryTargetRequest; |
| /** |
| * @param part |
| */ |
| public DeleteElementAction(IWorkbenchPart part) { |
| super(part); |
| |
| } |
| @Override |
| protected boolean calculateEnabled() { |
| |
| List operationSet = getOperationSet(); |
| if (operationSet.isEmpty()) { |
| return false; |
| } |
| Request request = getTargetRequest(); |
| Iterator editParts = operationSet.iterator(); |
| while (editParts.hasNext()) { |
| EditPart editPart = (EditPart) editParts.next(); |
| // disable on diagram links |
| if (editPart instanceof IGraphicalEditPart) { |
| IGraphicalEditPart gEditPart = (IGraphicalEditPart) editPart; |
| View view = (View) gEditPart.getModel(); |
| EObject element = ViewUtil.resolveSemanticElement(view); |
| if ((element.eIsProxy()) |
| || (element instanceof Diagram) |
| || BridgeHelper.isReadOnly(view)) { |
| return false; |
| } |
| } else { |
| Command curCommand = editPart.getCommand(request); |
| if (curCommand == null || (curCommand.canExecute() == false)) { |
| return false; |
| } |
| } |
| } |
| //return super.calculateEnabled(); |
| return true; |
| } |
| |
| @Override |
| public boolean isEnabled() { |
| setEnabled(true); |
| List list = getSelectedObjects(); |
| for (Iterator iter = list.iterator(); iter.hasNext();) { |
| EditPart element = (EditPart) iter.next(); |
| View view = (View)element.getModel(); |
| if(BridgeHelper.isReadOnly(view)){ |
| setEnabled(false); |
| return false; |
| } |
| } |
| return super.isEnabled(); |
| } |
| |
| |
| |
| protected Request createTargetRequest() { |
| return new EditCommandRequestWrapper(new DestroyElementRequest(getEditingDomain(), false)); |
| } |
| |
| /** |
| * Gets editing domain |
| * |
| * @return my editing domain |
| */ |
| protected TransactionalEditingDomain getEditingDomain() { |
| |
| // try adapting the workbench part |
| IWorkbenchPart part = getWorkbenchPart(); |
| |
| if (part != null) { |
| IEditingDomainProvider edProvider = (IEditingDomainProvider) part |
| .getAdapter(IEditingDomainProvider.class); |
| |
| if (edProvider != null) { |
| EditingDomain domain = edProvider.getEditingDomain(); |
| |
| if (domain instanceof TransactionalEditingDomain) { |
| return (TransactionalEditingDomain) domain; |
| } |
| } |
| } |
| return null; |
| } |
| |
| @Override |
| protected boolean isSelectionListener() { |
| // TODO Auto-generated method stub |
| return false; |
| } |
| |
| @Override |
| protected Request getTargetRequest() { |
| // TODO Auto-generated method stub |
| return super.getTargetRequest(); |
| } |
| |
| protected boolean showInContextMenu(){ |
| List operationSet = getOperationSet(); |
| if (operationSet.isEmpty()) { |
| return false; |
| } |
| Request request = getTargetRequest(); |
| Iterator editParts = operationSet.iterator(); |
| while (editParts.hasNext()) { |
| EditPart editPart = (EditPart) editParts.next(); |
| // disable on diagram links |
| if (editPart instanceof IGraphicalEditPart) { |
| IGraphicalEditPart gEditPart = (IGraphicalEditPart) editPart; |
| View view = (View) gEditPart.getModel(); |
| EObject element = ViewUtil.resolveSemanticElement(view); |
| if ((element.eIsProxy()) |
| || (element instanceof Diagram)) { |
| return false; |
| } |
| } else { |
| Command curCommand = editPart.getCommand(request); |
| if (curCommand == null || (curCommand.canExecute() == false)) { |
| return false; |
| } |
| } |
| } |
| return true; |
| } |
| |
| @Override |
| protected Command getCommand(Request request) { |
| //return super.getCommand(request); |
| List operationSet = getOperationSet(); |
| Iterator editParts = operationSet.iterator(); |
| CompositeTransactionalCommand command = |
| new CompositeTransactionalCommand(getEditingDomain(), getCommandLabel()); |
| while (editParts.hasNext()) { |
| EditPart editPart = (EditPart) editParts.next(); |
| // disable on diagram links |
| if (editPart instanceof IGraphicalEditPart){ |
| IGraphicalEditPart gEditPart = |
| (IGraphicalEditPart) editPart; |
| View view = (View)gEditPart.getModel(); |
| EObject element = ViewUtil.resolveSemanticElement(view); |
| if(element instanceof Diagram) |
| return null; |
| } |
| Command curCommand = null; |
| if(editPart instanceof IGraphicalEditPart && isCanonical((IGraphicalEditPart)editPart)){ |
| curCommand = editPart.getCommand(request); |
| }else{ |
| curCommand = editPart.getCommand(getSecondaryTargetRequest()); |
| } |
| if (curCommand != null) { |
| command.compose(new CommandProxy(curCommand)); |
| } |
| } |
| |
| if ((command.isEmpty()) |
| || (command.size() != operationSet.size())){ |
| return UnexecutableCommand.INSTANCE; |
| } |
| return new ICommandProxy(command); |
| } |
| @Override |
| protected void doRun(IProgressMonitor progressMonitor) { |
| |
| List operationSet = getOperationSet(); |
| List<BreakdownElement> elements = new ArrayList<BreakdownElement>(); |
| for (Iterator iter = operationSet.iterator(); iter |
| .hasNext();) { |
| Object editPart = iter.next(); |
| if (editPart instanceof EditPart) { |
| Object obj = ((EditPart) editPart).getModel(); |
| if (obj instanceof Node) { |
| MethodElement element = BridgeHelper.getMethodElement((Node)obj); |
| if (element != null && element instanceof BreakdownElement) { |
| elements.add((BreakdownElement)element); |
| } |
| } |
| } |
| } |
| if (!elements.isEmpty()) { |
| ProcessDeleteAction deleteAction = new ProcessDeleteAction() { |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.epf.authoring.ui.actions.MethodElementDeleteAction#createCommand(java.util.Collection) |
| */ |
| public org.eclipse.emf.common.command.Command createCommand( |
| Collection selection) { |
| domain = null; |
| for (Iterator iter = selection.iterator(); iter |
| .hasNext();) { |
| Object element = iter.next(); |
| if (element instanceof WorkProductDescriptor) { |
| domain = new AdapterFactoryEditingDomain( |
| TngAdapterFactory.INSTANCE |
| .getPBS_ComposedAdapterFactory(), |
| new BasicCommandStack()); |
| break; |
| } |
| } |
| if (domain == null) { |
| domain = new AdapterFactoryEditingDomain( |
| TngAdapterFactory.INSTANCE |
| .getWBS_ComposedAdapterFactory(), |
| new BasicCommandStack()); |
| } |
| return super.createCommand(selection); |
| } |
| |
| }; |
| deleteAction.updateSelection(new StructuredSelection( |
| elements)); |
| deleteAction.run(); |
| if (deleteAction.isDeletionConfirmed()) { |
| super.doRun(progressMonitor); |
| |
| // save the editor |
| // |
| BusyIndicator.showWhile(getWorkbenchPart().getSite().getShell() |
| .getDisplay(), new Runnable() { |
| |
| public void run() { |
| ((AbstractDiagramEditor)getWorkbenchPart()).doSave(new NullProgressMonitor()); |
| } |
| }); |
| } |
| |
| } else { |
| super.doRun(progressMonitor); |
| } |
| } |
| |
| @Override |
| public void init() { |
| super.init(); |
| setId(ActionFactory.DELETE.getId()); |
| setText(DiagramCoreResources.deleteCommand_label); |
| setToolTipText(DiagramCoreResources.deleteCommand_label); |
| 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)); |
| } |
| |
| @Override |
| protected List createOperationSet() { |
| // TODO Auto-generated method stub |
| return super.createOperationSet(); |
| } |
| |
| /** |
| * @param gep |
| * @return |
| */ |
| private boolean isCanonical(IGraphicalEditPart gep) { |
| EditPart parent = gep.getParent(); |
| if (parent instanceof IGraphicalEditPart) { |
| CanonicalEditPolicy cep = (CanonicalEditPolicy)parent.getEditPolicy(EditPolicyRoles.CANONICAL_ROLE); |
| if ( cep != null ) { |
| if (cep.isEnabled()) |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public Request getSecondaryTargetRequest(){ |
| if(secondaryTargetRequest == null){ |
| secondaryTargetRequest = new GroupRequest( |
| RequestConstants.REQ_DELETE); |
| } |
| return secondaryTargetRequest; |
| } |
| } |