Как сделать простой плагин для Android Studio для настраиваемой подсказки мыши - PullRequest
0 голосов
/ 11 марта 2020

В моем java проекте в Android Studio у меня есть перечисление, члены которого используются в качестве индексов в строковых массивах для локализации. Я не использую стандартные Android инструменты локализации, потому что проект переносим. Я обнаружил, что было бы удобно, когда вы наводите курсор мыши на значение перечисления, чтобы увидеть подсказку с первыми 50 символами соответствующей строки. Псевдокод довольно тривиален:

if classOf({word-under-mouse}) is MyStrIndEnum 
   then Hint(StringsArray[MyStrIndEnum.{word-under-mouse}.ordinal()]). 

Но можно ли написать сценарий, плагин или что-то еще, чтобы Android Studio сделала это? Я никогда не писал аддоны для IDE, поэтому, пожалуйста, посоветуйте, какой путь к go, и стоит ли с ним возиться просто для удобства.

1 Ответ

0 голосов
/ 12 марта 2020

Для этого нужно написать плагин, используя IntelliJ Idea и подкласс JavaDocumentationProvider.

На всякий случай, если кому-то интересно:

in build.gradle: 
intellij {
    plugins 'java'
    plugins 'android'
    version '191.8026.42'
    type 'IC'
}
runIde {
    ideDirectory 'C:/Program Files/Android/Android Studio'
}

В плагине. xml:

   <extensions defaultExtensionNs="com.intellij">
           <lang.documentationProvider order="first" language="JAVA" implementationClass="smpxg.TranslationDocumentationProvider" />
    </extensions>

Остальное - по умолчанию.

TranslationDocumentationProvider. java: (хотя методы isTextEnum и getTextForEnum указывают c для моего случая)

    public class TranslationDocumentationProvider extends JavaDocumentationProvider
    {
        @Override
        public String getQuickNavigateInfo(PsiElement element, PsiElement originalElement)
        {
            if (isTextEnum(element))
            {
                return getTextForEnum(element);
            }
            else
            {
                return super.getQuickNavigateInfo(element, originalElement);
            }
        }

String getTextForEnum(PsiElement element)
    {
        final PsiClass base = JavaPsiFacade.getInstance(element.getProject()).findClass("smpxg.langloc.RstEng", element.getResolveScope());
        if (base != null)
        {
            String const_name = element.getText();
            String src        = base.getText();
            int    ind        = src.indexOf("ELT." + const_name);
            int    len        = ("ELT." + const_name).length();
            if (ind != -1)
            {
                int    ind1 = src.indexOf('\n', ind + len);
                String s    = "";
                if (ind1 == -1)
                    s = src.substring(ind + len);
                else
                    s = src.substring(ind + len, ind1);
                if (s.length() > 0)
                {
                    int from = 0;
                    for (int i = 0; i < s.length(); i++)
                    {
                        if (Character.isLetterOrDigit(s.charAt(i)))
                            break;
                        from++;
                    }
                    int to = s.length() - 1;
                    for (int i = s.length() - 1; i >= 0; i--)
                    {
                        if (Character.isLetterOrDigit(s.charAt(i)))
                            break;
                        to--;
                    }
                    if (from < to)
                    {
                        s = s.substring(from, to + 1);
                        if (s.length() > 150)
                            s = s.substring(0, 150) + "...";
                        return "<b>Eng:</b> " + s;
                    }
                }
            }
        }
        return element.getText();
    }

boolean isTextEnum(PsiElement element)
    {
        if (element != null)
        {
            ASTNode ast_node = element.getNode();

            if (ast_node == null)
            {
                return false;
            }
            String element_type = ast_node.getElementType().toString();
            if (element_type.equals("ENUM_CONSTANT"))
            {
                PsiEnumConstantImpl en = null;
                try
                {
                    en = (PsiEnumConstantImpl) element;
                }
                catch (Throwable e)
                {

                }
                if (en != null)
                {
                    PsiClass enum_class = en.getContainingClass();
                    if (enum_class != null)
                    {
                        String class_name = enum_class.getQualifiedName();
                        if (class_name != null && class_name.equals("smpxg.langloc.ELT"))
                            return true;
                    }
                }
            }
        }
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...