Package org.jetbrains.plugins.clojure.editor

Source Code of org.jetbrains.plugins.clojure.editor.ClojureEnterHandler

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;
  }
}
TOP

Related Classes of org.jetbrains.plugins.clojure.editor.ClojureEnterHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.