package org.yakindu.sct.ui.editor.providers;
import java.util.Hashtable;
import org.eclipse.gmf.runtime.common.ui.services.action.global.AbstractGlobalActionHandlerProvider;
import org.eclipse.gmf.runtime.common.ui.services.action.global.IGlobalActionHandler;
import org.eclipse.gmf.runtime.common.ui.services.action.global.IGlobalActionHandlerContext;
import org.eclipse.gmf.runtime.diagram.ui.providers.DiagramGlobalActionHandler;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPart;
/**
* This is a copy of
* {@link org.eclipse.gmf.runtime.diagram.ui.providers.DiagramGlobalActionHandlerProvider}.
*
* We had to copy the original class because it is final, so we cannot subclass
* it.
*
* The only purpose of this copy is to return
* {@link org.yakindu.sct.ui.editor.providers.StatechartDiagramGlobalActionHandler}
* which returns our own copy command
* {@link org.yakindu.sct.ui.editor.providers.SubdiagramAwareCopyCommand} to
* copy sub diagrams when states get copied.
*
* @author kutz
*
*/
@SuppressWarnings("rawtypes")
public class StatechartDiagramGlobalActionHandlerProvider extends AbstractGlobalActionHandlerProvider {
/**
* List that contains all the IGlobalActionHandlers mapped to the
* IWorkbenchParts
*/
private Hashtable handlerList = new Hashtable();
/**
* Constructor for DiagramGlobalActionHandlerProvider.
*/
public StatechartDiagramGlobalActionHandlerProvider() {
super();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.common.ui.services.action.global.IGlobalActionHandlerProvider#getGlobalActionHandler(org.eclipse.gmf.runtime.common.ui.services.action.global.IGlobalActionHandlerContext)
*/
@SuppressWarnings("unchecked")
public IGlobalActionHandler getGlobalActionHandler(
final IGlobalActionHandlerContext context) {
/* create the handler */
if (!getHandlerList().containsKey(context.getActivePart())) {
// PATCH START
getHandlerList().put(context.getActivePart(),
new StatechartDiagramGlobalActionHandler());
// PATCH END
/*
* register as a part listener so that the cache can be cleared when
* the part is disposed
*/
context.getActivePart().getSite().getPage().addPartListener(
new IPartListener() {
private IWorkbenchPart localPart = context.getActivePart();
/**
* @see org.eclipse.ui.IPartListener#partActivated(IWorkbenchPart)
*/
public void partActivated(IWorkbenchPart part) {
// NULL implementation
}
/**
* @see org.eclipse.ui.IPartListener#partBroughtToTop(IWorkbenchPart)
*/
public void partBroughtToTop(IWorkbenchPart part) {
// NULL implementation
}
/**
* @see org.eclipse.ui.IPartListener#partClosed(IWorkbenchPart)
*/
public void partClosed(IWorkbenchPart part) {
/* remove the cache associated with the part */
if (part != null && part == localPart
&& getHandlerList().containsKey(part)) {
getHandlerList().remove(part);
localPart.getSite().getPage().removePartListener(
this);
localPart = null;
}
}
/**
* @see org.eclipse.ui.IPartListener#partDeactivated(IWorkbenchPart)
*/
public void partDeactivated(IWorkbenchPart part) {
// NULL implementation
}
/**
* @see org.eclipse.ui.IPartListener#partOpened(IWorkbenchPart)
*/
public void partOpened(IWorkbenchPart part) {
// NULL implementation
}
});
}
return (DiagramGlobalActionHandler) getHandlerList().get(
context.getActivePart());
}
/**
* Returns the handlerList.
*
* @return Hashtable
*/
private Hashtable getHandlerList() {
return handlerList;
}
}