美文网首页
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