package com.chrisfolger.needsmoredojo.intellij.actions;
import com.chrisfolger.needsmoredojo.core.amd.importing.ImportReorderer;
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;
/**
* This action allows you to toggle an AMD import between using a relative syntax or absolute syntax, if possible.
*/
public class TogglePathSyntaxAction extends JavaScriptAction
{
@Override
public void actionPerformed(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", "Toggle AMD Import Path Syntax", "No valid import found", NotificationType.WARNING).notify(file.getProject());
return;
}
final PsiElement define = results[0];
final PsiElement replacement = reorderer.getOppositePathSyntaxFromImport(define);
if(replacement != null)
{
CommandProcessor.getInstance().executeCommand(file.getProject(), new Runnable() {
@Override
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
define.replace(replacement);
}
});
}
},
"Toggle AMD Import Path Syntax",
"Toggle AMD Import Path Syntax");
}
else
{
new Notification("needsmoredojo", "Toggle AMD Import Path Syntax", "No alternative syntax found", NotificationType.WARNING).notify(file.getProject());
}
}
}