Intellij Idea插件开发

参考资料

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以及不断尝试完成的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351