package com.lightd.ideap.maven.actions;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
public abstract class MvnDiagramAction extends MvnModuleContextAction {
private final AnAction diagramAction = ActionManager.getInstance().getAction("ShowUmlDiagramPopup");
@Override
public void update(AnActionEvent e) {
super.update(e);
Presentation presentation = e.getPresentation();
presentation.setVisible(diagramAction != null);
presentation.setEnabled(isAvailable(e));
}
@Override
public void actionPerformed(AnActionEvent e) {
AnActionEvent moduleEvent = rebuildContext(e);
moduleEvent.setInjectedContext(true);
diagramAction.actionPerformed(moduleEvent);
}
@Override
protected boolean isAvailable(AnActionEvent e) {
return diagramAction != null && super.isAvailable(e);
}
private AnActionEvent rebuildContext(AnActionEvent e) {
assert e.getProject() != null;
MavenElementDataContext context = new MavenElementDataContext(e.getDataContext());
wrap(e.getProject(), context, e);
return new AnActionEvent(e.getInputEvent(), context, e.getPlace(), e.getPresentation(), e.getActionManager(), e.getModifiers());
}
protected abstract void wrap(@NotNull Project project, MockElement mockElement, AnActionEvent event);
interface MockElement {
void mock(String key, Object element, Collection<String> contextKeys);
}
class MavenElementDataContext implements DataContext, MockElement {
private String elementKey;
private Object element;
private Collection<String> contextKeys;
private final DataContext context;
MavenElementDataContext(DataContext context) {
this.context = context;
}
@Override
public void mock(String key, Object element, Collection<String> contextKeys) {
this.elementKey = key;
this.element = element;
this.contextKeys = contextKeys;
}
@Nullable
@Override
public Object getData(@NonNls String key) {
if (!contextKeys.contains(key)) return null;
Object data = context.getData(key);
if (data == null && elementKey.equals(key)) data = element;
return data;
}
}
}