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.ImportCreator;
import com.chrisfolger.needsmoredojo.core.amd.importing.ImportResolver;
import com.chrisfolger.needsmoredojo.core.settings.DojoSettings;
import com.chrisfolger.needsmoredojo.core.util.PsiFileUtil;
import com.chrisfolger.needsmoredojo.intellij.dialog.AddNewImportSelectionDialog;
import com.intellij.ide.highlighter.HtmlFileType;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
/**
* the action responsible for launching the add import dialog
*/
public class AddNewImportAction extends JavaScriptAction
{
@Override
public void actionPerformed(AnActionEvent e)
{
Project project = e.getProject();
final PsiFile psiFile = PsiFileUtil.getPsiFileInCurrentEditor(project);
Editor editor = e.getData(PlatformDataKeys.EDITOR);
String initialChoice = "";
PsiElement element = null;
if(editor != null)
{
element = psiFile.findElementAt(editor.getCaretModel().getOffset());
initialChoice = new ImportCreator().getSuggestedImport(element);
}
String warning = "";
String projectSources = ServiceManager.getService(project, DojoSettings.class).getProjectSourcesDirectory();
if(projectSources == null || projectSources.equals(""))
{
warning += "\n*For best results, configure your project sources in the settings dialog*";
}
String importModule = Messages.showInputDialog("Enter the module name or its full path" + warning, "Add new AMD import", null, initialChoice, null);
if(importModule == null)
{
return;
}
DojoSettings settingsService = ServiceManager.getService(psiFile.getProject(), DojoSettings.class);
String[] choices = new ImportResolver().getPossibleDojoImports(psiFile, importModule, settingsService.isPreferRelativeImports(), settingsService.isAddModuleIfThereAreNoneDefined(), settingsService.isAllowCaseInsensitiveSearch());
if(choices.length == 1 && settingsService.isAddModuleIfThereAreNoneDefined())
{
// do nothing for this case
}
else if(choices.length > 0)
{
AddNewImportSelectionDialog dialog = new AddNewImportSelectionDialog(project);
dialog.getPeer().setTitle("Add New AMD Import");
dialog.show(choices, choices[0]);
if(dialog.isOK())
{
importModule = dialog.getSelectedItem();
}
else
{
importModule = null;
}
}
else if (choices.length == 0)
{
new Notification("needsmoredojo", "Add new Import", "No module was found to import", NotificationType.WARNING).notify(psiFile.getProject());
return;
}
if(importModule == null)
{
return;
}
final String importedModule = importModule;
if(importedModule.equals(""))
{
Notifications.Bus.notify(new Notification("needsmoredojo", "Add new Import", "Invalid module", NotificationType.INFORMATION));
return;
}
// determine if there is a nearest define/require to add to
DefineStatement statementToAddTo = null;
if(element != null)
{
statementToAddTo = new DefineResolver().getNearestImportBlock(element);
}
final DefineStatement finalStatementToAddTo = statementToAddTo;
CommandProcessor.getInstance().executeCommand(psiFile.getProject(), new Runnable() {
@Override
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
boolean result;
if(finalStatementToAddTo != null)
{
result = new ImportCreator().addImport(psiFile, importedModule, finalStatementToAddTo);
}
else
{
result = new ImportCreator().addImport(psiFile, importedModule);
}
if(!result)
{
new Notification("needsmoredojo", "Add new Import", "A define statement was not found", NotificationType.WARNING).notify(psiFile.getProject());
}
}
});
}
},
"Add new AMD import",
"Add new AMD import");
}
}