package org.jetbrains.plugins.clojure.editor;
import com.intellij.codeInsight.editorActions.enter.EnterHandlerDelegate;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.clojure.lexer.ClojureTokenTypes;
import org.jetbrains.plugins.clojure.psi.api.ClojureFile;
/**
* @author peter
*/
public class ClojureEnterHandler implements EnterHandlerDelegate {
public Result preprocessEnter(@NotNull final PsiFile file, @NotNull final Editor editor, @NotNull final Ref<Integer> caretOffsetRef,
@NotNull final Ref<Integer> caretAdvance, @NotNull final DataContext dataContext,
@Nullable final EditorActionHandler originalHandler) {
if (file instanceof ClojureFile) {
Document document = editor.getDocument();
PsiDocumentManager.getInstance(file.getProject()).commitDocument(document);
int caret = caretOffsetRef.get().intValue();
PsiElement leaf = file.findElementAt(caret);
if (leaf instanceof PsiComment && ClojureTokenTypes.LINE_COMMENT == leaf.getNode().getElementType()) {
String beforeCaret = leaf.getText().substring(0, caret - leaf.getTextRange().getStartOffset());
int semicolonCount = 0;
while (semicolonCount < beforeCaret.length() && beforeCaret.charAt(semicolonCount) == ';') {
semicolonCount++;
}
if (!StringUtil.startsWith(document.getCharsSequence(), caret, ";")) {
String prefix = StringUtil.repeat(";", semicolonCount);
if (document.getCharsSequence().charAt(caret) != ' ') {
prefix += " ";
}
document.insertString(caret, prefix);
editor.getCaretModel().moveToOffset(caret);
originalHandler.execute(editor, dataContext);
editor.getCaretModel().moveToOffset(editor.getCaretModel().getOffset() + prefix.length());
return Result.Stop;
}
}
}
return Result.Continue;
}
public Result postProcessEnter(@NotNull PsiFile psiFile, @NotNull Editor editor, @NotNull DataContext dataContext) {
return Result.Continue;
}
}