package com.chrisfolger.needsmoredojo.intellij.actions;
import com.chrisfolger.needsmoredojo.core.amd.define.DefineResolver;
import com.chrisfolger.needsmoredojo.core.amd.define.DefineStatement;
import com.chrisfolger.needsmoredojo.core.amd.importing.ImportReorderer;
import com.chrisfolger.needsmoredojo.core.amd.importing.InvalidDefineException;
import com.chrisfolger.needsmoredojo.core.amd.psi.AMDPsiUtil;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import java.util.ArrayList;
import java.util.List;
public abstract class SendToAction extends JavaScriptAction
{
@Override
public void actionPerformed(final AnActionEvent e)
{
final Editor editor = e.getData(PlatformDataKeys.EDITOR);
PsiFile file = e.getData(LangDataKeys.PSI_FILE);
final PsiElement element = file.findElementAt(editor.getCaretModel().getOffset());
if(element == null)
{
return;
}
ImportReorderer reorderer = new ImportReorderer();
PsiElement[] results = reorderer.getSourceAndDestination(element, AMDPsiUtil.Direction.NONE);
if(results.length == 0)
{
new Notification("needsmoredojo", "Send AMD Import to End", "No valid import found", NotificationType.WARNING).notify(file.getProject());
return;
}
final PsiElement define = results[0];
PsiElement parameter = null;
final List<PsiElement> defines = new ArrayList<PsiElement>();
final List<PsiElement> parameters = new ArrayList<PsiElement>();
DefineResolver resolver = new DefineResolver();
final DefineStatement importBlock = resolver.getNearestImportBlock(define);
if(importBlock == null)
{
new Notification("needsmoredojo", "Send AMD Import to End", "No valid import found", NotificationType.WARNING).notify(file.getProject());
return;
}
try {
resolver.addDefinesAndParametersOfImportBlock(importBlock.getCallExpression(), defines, parameters);
} catch (InvalidDefineException e1) { /* not interested in this failure case */ }
for (int i = 0; i < defines.size(); i++)
{
if(defines.get(i).equals(define))
{
if(i > parameters.size() - 1)
{
return;
}
parameter = parameters.get(i);
break;
// FIXME if parameter is out of index
}
}
final PsiElement finalParameter = parameter;
CommandProcessor.getInstance().executeCommand(file.getProject(), new Runnable() {
@Override
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
moveAction(e, define, finalParameter, defines, parameters, importBlock);
}
});
}
},
getName(),
getName());
}
protected abstract String getName();
protected abstract void moveAction(AnActionEvent e, PsiElement define, PsiElement parameter, List<PsiElement> defines, List<PsiElement> parameters, DefineStatement defineStatement);
}