package org.jetbrains.plugins.clojure.editor.selection; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.clojure.psi.ClojurePsiElement; import org.jetbrains.plugins.clojure.psi.api.*; import java.util.List; /** * @author ilyas */ public class ClojureListSelectioner extends ClojureBasicSelectioner { public boolean canSelect(PsiElement e) { return e instanceof ClList || e instanceof ClVector || e instanceof ClSet || e instanceof ClMap; } @Override public List<TextRange> select(PsiElement element, CharSequence editorText, int cursorOffset, Editor editor) { List<TextRange> result = super.select(element, editorText, cursorOffset, editor); if (element instanceof ClBraced) { ClBraced list = (ClBraced) element; final PsiElement left = list.getFirstBrace(); final PsiElement right = list.getLastBrace(); if (right != null) { result.add(new TextRange(left.getTextRange().getStartOffset(), right.getTextRange().getEndOffset())); } else { result.add(new TextRange(left.getTextRange().getStartOffset(), element.getTextRange().getEndOffset())); } } if (element instanceof ClojurePsiElement) { final ClojurePsiElement psi = (ClojurePsiElement) element; final PsiElement fst = psi.getFirstNonLeafElement(); final PsiElement lst = psi.getLastNonLeafElement(); final int start = fst != null ? fst.getTextRange().getStartOffset() : psi.getTextRange().getStartOffset(); final int end = lst != null ? lst.getTextRange().getEndOffset() : psi.getTextRange().getEndOffset(); result.add(new TextRange(start, end)); } return result; } public int getMinimalTextRangeLength(@NotNull PsiElement element) { return 0; } }