blob: f069940f9b399a6af92da5dcf310d2affc90bfa5 [file] [log] [blame]
/**
*
*/
package org.eclipse.epf.diagram.core.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramCommandStack;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
import org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
/**
*
* @author Shashidhar Kannoori
*
*/
public abstract class ActionDelegate extends Action implements IObjectActionDelegate {
protected IWorkbenchPart targetPart;
protected List<EditPart> selectedParts = new ArrayList<EditPart>();
protected Request targetRequest;
public ActionDelegate(){
}
/**
*
*/
public ActionDelegate(IAction action, IWorkbenchPart targetPart) {
this.targetPart = targetPart;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
*/
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
// TODO Auto-generated method stub
this.targetPart = targetPart;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
public void run(IAction action) {
// TODO Auto-generated method stub
execute(getCommand(), new NullProgressMonitor());
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged(IAction action, ISelection selection) {
dropMenuItems();
selectedParts.clear();
if (selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
if (structuredSelection.size() >0
&& structuredSelection.getFirstElement() instanceof EditPart) {
selectedParts.addAll(structuredSelection.toList());
}
}
}
/**
* gives access to the diagram command stack
*
* @return the diagram command stack
*/
protected DiagramCommandStack getDiagramCommandStack() {
Object stack = targetPart.getAdapter(CommandStack.class);
return (stack instanceof DiagramCommandStack) ? (DiagramCommandStack) stack
: null;
}
protected final IWorkbenchPart getWorkbenchPart() {
return targetPart;
}
/**
* Gets the contextmenuprovider.
* @return
*/
protected DiagramContextMenuProvider getDiagramContextMenuProvider() {
if(targetPart != null){
DiagramGraphicalViewer viewer = (DiagramGraphicalViewer) targetPart
.getAdapter(GraphicalViewer.class);
DiagramContextMenuProvider provider = (DiagramContextMenuProvider) viewer
.getContextMenu();
return provider;
}
return null;
}
/**
* Executes the given {@link Command}.
*
* @param command
* the command to execute
* @param progressMonitor
* the progress monitor to use during execution
*/
protected final void execute(Command command,
IProgressMonitor progressMonitor) {
if (command == null || !command.canExecute())
return;
if (getDiagramCommandStack() != null)
getDiagramCommandStack().execute(command, progressMonitor);
}
protected abstract Command getCommand();
protected void dropMenuItems(){
}
/**
* 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;
}
/**
* Gets a request to be addressed to the operation set
*
* @return a target request
*/
protected Request getTargetRequest() {
if (targetRequest == null)
targetRequest = createTargetRequest();
return targetRequest;
}
/**
* Creates a new target request
*
* @return the new target request
*/
protected abstract Request createTargetRequest();
}