package fr.adrienbrault.idea.symfony2plugin.translation;
import com.intellij.codeInsight.intention.impl.BaseIntentionAction;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.util.IncorrectOperationException;
import fr.adrienbrault.idea.symfony2plugin.translation.util.TranslationInsertUtil;
import org.jetbrains.annotations.NotNull;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class TranslationKeyIntentionAction extends BaseIntentionAction {
@NotNull
private PsiFile psiFile;
@NotNull
private String keyName;
/**
* @param psiFile Translation file as yaml
* @param keyName key name like "translation" or "translation.sub.name"
*/
public TranslationKeyIntentionAction(@NotNull PsiFile psiFile, @NotNull String keyName) {
this.psiFile = psiFile;
this.keyName = keyName;
}
@NotNull
@Override
public String getText() {
String filename = psiFile.getName();
// try to find suitable presentable filename
VirtualFile virtualFile = psiFile.getVirtualFile();
if(virtualFile != null) {
filename = virtualFile.getPath();
String relativePath = VfsUtil.getRelativePath(virtualFile, psiFile.getProject().getBaseDir(), '/');
if(relativePath != null) {
filename = relativePath;
}
}
return "Create translation key: " + filename;
}
@NotNull
@Override
public String getFamilyName() {
return "Symfony";
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
return true;
}
@Override
public void invoke(@NotNull Project project, final Editor editor, final PsiFile file) throws IncorrectOperationException {
VirtualFile virtualFile = TranslationKeyIntentionAction.this.psiFile.getVirtualFile();
if(virtualFile == null) {
return;
}
final PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
if(psiFile == null) {
return;
}
CommandProcessor.getInstance().executeCommand(psiFile.getProject(), () -> ApplicationManager.getApplication().runWriteAction(() -> {
TranslationInsertUtil.invokeTranslation(psiFile, keyName, keyName);
}), "Translation insert " + psiFile.getName(), null);
}
}