package org.jetbrains.plugins.cucumber.codeinsight;
import com.intellij.codeInsight.editorActions.enter.EnterHandlerDelegateAdapter;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorModificationUtil;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.cucumber.psi.GherkinFile;
import org.jetbrains.plugins.cucumber.psi.GherkinTokenTypes;
/**
* @author yole
*/
public class CucumberEnterHandler extends EnterHandlerDelegateAdapter {
public static final String PYSTRING_QUOTES = "\"\"\"";
public Result preprocessEnter(@NotNull PsiFile file,
@NotNull Editor editor,
@NotNull Ref<Integer> caretOffset,
@NotNull Ref<Integer> caretAdvance,
@NotNull DataContext dataContext,
EditorActionHandler originalHandler) {
if (!(file instanceof GherkinFile)) {
return Result.Continue;
}
int caretOffsetValue = caretOffset.get().intValue();
if (caretOffsetValue < 3) {
return Result.Continue;
}
final Document document = editor.getDocument();
final String docText = document.getText();
PsiDocumentManager.getInstance(file.getProject()).commitDocument(editor.getDocument());
final PsiElement probableQuotes = file.findElementAt(caretOffsetValue - 1);
if (probableQuotes != null && probableQuotes.getNode().getElementType() == GherkinTokenTypes.PYSTRING) {
final PsiElement probablePyStringText =
document.getTextLength() == PYSTRING_QUOTES.length() ? null : file.findElementAt(caretOffsetValue - 1 - PYSTRING_QUOTES.length());
if (probablePyStringText == null || probablePyStringText.getNode().getElementType() != GherkinTokenTypes.PYSTRING_TEXT) {
int line = document.getLineNumber(caretOffsetValue);
int lineStart = document.getLineStartOffset(line);
int textStart = CharArrayUtil.shiftForward(docText, lineStart, " \t");
final String space = docText.subSequence(lineStart, textStart).toString();
// insert closing triple quote
EditorModificationUtil.insertStringAtCaret(editor, "\n" + space + "\n" + space + PYSTRING_QUOTES);
editor.getCaretModel().moveCaretRelatively(-3, -1, false, false, true);
return Result.Stop;
}
}
return Result.Continue;
}
}