package org.jetbrains.plugins.clojure.editor.selection; import com.intellij.psi.PsiElement; import com.intellij.lang.ASTNode; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.editor.Editor; import java.util.List; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.clojure.psi.api.ClLiteral; import org.jetbrains.plugins.clojure.lexer.ClojureTokenTypes; /** * @author ilyas */ public class ClojureLiteralSelectioner extends ClojureBasicSelectioner { public boolean canSelect(PsiElement e) { PsiElement parent = e.getParent(); return isStringLiteral(e) || isStringLiteral(parent); } private static boolean isStringLiteral(PsiElement element) { if (!(element instanceof ClLiteral)) return false; ASTNode node = element.getNode(); if (node == null) return false; ASTNode[] children = node.getChildren(null); return children.length == 1 && (children[0].getElementType() == ClojureTokenTypes.STRING_LITERAL); } public List<TextRange> select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) { List<TextRange> result = super.select(e, editorText, cursorOffset, editor); TextRange range = e.getTextRange(); if (range.getLength() <= 2) { result.add(range); } else { result.add(new TextRange(range.getStartOffset() + 1, range.getEndOffset() - 1)); } return result; } public int getMinimalTextRangeLength(@NotNull PsiElement element) { return 0; } }