美文网首页
Intellij Idea插件开发

Intellij Idea插件开发

作者: cain07 | 来源:发表于2020-08-18 09:43 被阅读0次

参考资料

1.Intellij Idea插件开发--Android文件修改

https://juejin.im/post/6844903919852748814#heading-10

2.Android Studio 插件

https://github.com/PegasusCharles/Android-Studio-Plugins-cn

3.Android Studio 常用插件及浅释

https://github.com/jp1017/AndroidStudioPlugins

4.

问题

1.动态穿件的 多个jtextfield 如何实现数据修改 监听 绑定

           JTextField textField1 = new JTextField();
            textField1.setPreferredSize(new Dimension(0,20));
            textField1.setName(","+i);
            textField1.addFocusListener(new MyFocusListener());

textField1可以设置一个 id 然后注册 FocusListener

 public void focusLost(FocusEvent e) {//失去焦点
            JTextField source = (JTextField) e.getSource();
            String text = source.getText();
            String uiClassID = source.getUIClassID();
            Keymap keymap = source.getKeymap();
            System.out.println("*********FocusEvent************"+source.getName());

        }

source.getName()既可以 拿到 当前的 JTextField 控件

2. 页面的布局

        Container container = jDialog.getContentPane();
        //整个页面的 布局 是 垂直
        container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));

        //整个页面的 布局 是 水平
        container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));

3. 用 gson 把 json 转 bean 这个 是list嵌套list

    /**
     * @param json list的序列化字符串
     * @param <T>  T类型
     * @return List<T>
     */
    public static <T> List<T> toList(String json, Class<T> clazz) {
        List<T> list = new ArrayList<>();
        try {
            JsonArray array = new JsonParser().parse(json).getAsJsonArray();
            for (final JsonElement elem : array) {
                list.add(new Gson().fromJson(elem, clazz));
            }
        } catch (Exception e) {
            return null;
        }
        return list;
    }

非嵌套list

 public static <T> T jsonToList(String strJsonData, Class<?> cls) {
        Gson gson = new Gson();
        T t = gson.fromJson(strJsonData, new TypeToken<T>(){}.getType());
        return t;
    }

4. PsiFile 读取文件 转 File

getPsiFile

//获取指定名称的文件
    public static PsiFile getPsiFile(Project project, String fileName) {
        PsiFile[] psiFiles = FilenameIndex.getFilesByName(project, fileName, GlobalSearchScope.allScope(project));
        PsiFile psiFile = psiFiles[0];
        return psiFile;
    }
 PsiFile psiFile = PsiElementUtils.getPsiFile(project, "文件");
 VirtualFile virtualFile = psiFile.getVirtualFile();
 File jsonFile = new File(virtualFile.getCanonicalPath());

5. 正则匹配 单行注释 开头 注释开头

  String commentsStr = "//this is single line comments";
  Pattern singleLineCommentP = Pattern.compile("^//.*?$");
  boolean matches = commentsStr.matches("^//.*?$");
  System.out.println(matches);

6. 难点

  • 写入 gradle 文件
  • initial.replace(replacement); 可以把一正行 替换掉 测试中 如果 行里 有 . 并且没有在双引号里面 写入 文件以后 . 两边有空格
    com.dev 写入以后 则会 com . dev
    如果在双引号 里面 则没有问题
    "com.cain.join"
    public static void replacePsiElement2(PsiElement initial, String replacetext, @NotNull Project project) {
        PsiElementFactory psiElementFactory = JavaPsiFacade.getInstance(project).getElementFactory();
        PsiElement replacement = psiElementFactory.createExpressionFromText(replacetext.trim(),null);
        ApplicationManager.getApplication().invokeLater(() ->
                WriteCommandAction.runWriteCommandAction(project, () -> {
                    //initial.getParent().add(replacement, initial);
                    initial.getLastChild().replace(replacement);
                    //initial.getParent().replace(replacement);
                    //initial.(replacement);
                }));
    }

解决:

  • 试 字符转义 StringBuffer 拼接 等 解决不来这个问题
    换个思路 如果只 截取 替换 后半部分 因为一行里 是这样的格式
    dev.getversion = "com.cain.jioin:2.3.4"
    只取 后半部分 暂时解决这个问题
 initial.getLastChild().replace(replacement);

看了一下源码太多 没有时间看了 不知道 为什么写入 gradle 文件 . 前后会有空格 大神有解决的 可以指教一下!!

7. Files 也可以 修改文件

 PsiFile[] allGradles = FilenameIndex.getFilesByName(project, "build.gradle",
                GlobalSearchScope.allScope(project));

        for (PsiFile gradleFile: allGradles){
            String text = gradleFile.getText();

            if (text.contains(BEGIN)){

                VirtualFile virtualFile = gradleFile.getVirtualFile();
                try {
                    List<String> list = Files.readAllLines(Paths.get(virtualFile.getCanonicalPath()));
                    if(!list.contains("    " + MATERIAL_LIB)){
                        list.add(list.size() - 1, "    " + MATERIAL_LIB);
                        Files.write(Paths.get(virtualFile.getCanonicalPath()), list);
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }

8. 打印PsiElement元素

public static void printPsiElement(PsiFile psiFile) {
        PsiElement[] psiElements = psiFile.getChildren();
        System.out.println("psiElements---"+psiElements.length);
        for (PsiElement psiElement : psiElements) {
            System.out.println("psiElement---"+psiElement.getText());
            System.out.println("getChildren---"+psiElement.getChildren().length);
            if (psiElement.getChildren().length == 0) continue;
            System.out.println("getFirstChild---"+psiElement.getFirstChild().getText());
            System.out.println("getLastChild---"+psiElement.getLastChild().getText());
            System.out.println("getOriginalElement---"+psiElement.getOriginalElement().getText());
        }
    }

9.

遇到的问题 比 记录的要多啊
这次插件的开发过程简直是痛并快乐着的一次体验,坚持就是胜利,解决了一个又一个问题 因为现有大部分关于IDEA插件的开发文章都是比较简单的介绍,特别是针对Android文件(包括gradle文件,properties文件,AndroidManifest.xml文件)的修改更是难找。修改gradle文件 的 文档机会没有 谷歌了一下 也没什么可以借鉴的 所以,关于这些文件的修改开发,都是靠类比Java文件结构推理,查看IDEA 插件SDK API以及不断尝试完成的。

相关文章

网友评论

      本文标题:Intellij Idea插件开发

      本文链接:https://www.haomeiwen.com/subject/pqxndktx.html