--- /dev/null
+package org.jetbrains.javafx.findUsages;
+
+import com.intellij.lang.cacheBuilder.DefaultWordsScanner;
+import com.intellij.lang.cacheBuilder.WordsScanner;
+import com.intellij.lang.findUsages.FindUsagesProvider;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiNamedElement;
+import com.intellij.psi.util.PsiTreeUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.javafx.lang.lexer.JavaFxFlexLexer;
+import org.jetbrains.javafx.lang.lexer.JavaFxTokenTypes;
+import org.jetbrains.javafx.lang.psi.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @author: Alexey.Ivanov
+ */
+public class JavaFxFindUsagesProvider implements FindUsagesProvider {
+ @Override
+ public WordsScanner getWordsScanner() {
+ return new DefaultWordsScanner(new JavaFxFlexLexer(), JavaFxTokenTypes.NAME, JavaFxTokenTypes.COMMENTS, JavaFxTokenTypes.LITERALS);
+ }
+
+ @Override
+ public boolean canFindUsagesFor(@NotNull final PsiElement psiElement) {
+ return psiElement instanceof JavaFxFunctionDefinition || psiElement instanceof JavaFxVariableDeclaration ||
+ psiElement instanceof JavaFxClassDefinition || psiElement instanceof JavaFxParameter;
+ }
+
+ @Override
+ public String getHelpId(@NotNull final PsiElement psiElement) {
+ return null;
+ }
+
+ @NotNull
+ @Override
+ public String getType(@NotNull final PsiElement element) {
+ if (element instanceof JavaFxParameter) {
+ return "parameter";
+ }
+ if (element instanceof JavaFxFunction) {
+ return "function";
+ }
+ if (element instanceof JavaFxClassDefinition) {
+ return "class";
+ }
+ if (element instanceof JavaFxVariableDeclaration) {
+ return "variable";
+ }
+ return "";
+ }
+
+ @NotNull
+ @Override
+ public String getDescriptiveName(@NotNull final PsiElement element) {
+ if (element instanceof PsiNamedElement) {
+ final String name = ((PsiNamedElement)element).getName();
+ return (name == null) ? "<unnamed>" : name;
+ }
+ return "";
+ }
+
+ @NotNull
+ @Override
+ public String getNodeText(@NotNull final PsiElement element, final boolean useFullName) {
+ if (element instanceof JavaFxParameter) {
+ StringBuilder result = new StringBuilder(((JavaFxParameter)element).getName());
+ final JavaFxFunctionDefinition function = PsiTreeUtil.getParentOfType(element, JavaFxFunctionDefinition.class);
+ if (function != null) {
+ result.append(" of ");
+ appendFunctionDescription(result, function);
+ }
+ return result.toString();
+ }
+ if (element instanceof JavaFxFunctionDefinition) {
+ StringBuilder result = new StringBuilder();
+ appendFunctionDescription(result, (JavaFxFunctionDefinition)element);
+ return result.toString();
+ }
+ return getDescriptiveName(element);
+ }
+
+ private static void appendFunctionDescription(final StringBuilder result, final JavaFxFunctionDefinition function) {
+ result.append(function.getName()).append("()");
+ final JavaFxClassDefinition containingClass = PsiTreeUtil.getParentOfType(function, JavaFxClassDefinition.class);
+ if (containingClass != null) {
+ result.append(" of class ").append(containingClass.getName());
+ }
+ }
+}