当前位置: 首页 > article >正文

idea插件开发的第四天-完善JSON工具

介绍

Demo说明

  • 本文基于maven项目开发,idea版本为2022.3以上,jdk为1.8
  • 本文在Tools插件之上进行开发
  • 本次demo将使用idea的一些组件优化

Tools插件说明

  • Tools插件是一个Idea插件,此插件提供统一Spi规范,极大的降低了idea插件的开发难度,并提供开发者模块,可以极大的为开发者开发此插件提供便利
  • Tools插件安装需要idea2022.3以上版本
  • 插件下载连接: https://download.csdn.net/download/qq_42413011/89702325
  • sdk下载连接: https://download.csdn.net/download/qq_42413011/89702330
  • pojo-serializer插件: https://gitee.com/myprofile/pojo-serializer

正文

打开上一篇文章项目

在这里插入图片描述

修改pom文件,增加idea的依赖

在这里插入图片描述
shadow插件排除这两个依赖,这两个idea开发工具中已经存在了,不需要打包进jar
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lhstack</groupId>
    <artifactId>tools-plugin-example</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <fastjson.version>2.0.52</fastjson.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>sdk</groupId>
            <artifactId>sdk</artifactId>
            <version>0.0.1</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/sdk-1.0.0.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>app</groupId>
            <artifactId>app</artifactId>
            <version>0.0.1</version>
            <scope>system</scope>
            <systemPath>F:\\Repo\\Gradle\\caches\\modules-2\\files-2.1\\com.jetbrains.intellij.idea\\ideaIC\\2022.3\\4d343cadac04a0a31d70f6f96facfaa7f949df01\\ideaIC-2022.3\\lib\\app.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>util</groupId>
            <artifactId>util</artifactId>
            <version>0.0.1</version>
            <scope>system</scope>
            <systemPath>F:\\Repo\\Gradle\\caches\\modules-2\\files-2.1\\com.jetbrains.intellij.idea\\ideaIC\\2022.3\\4d343cadac04a0a31d70f6f96facfaa7f949df01\\ideaIC-2022.3\\lib\\util.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>



    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <excludes>
                                    <exclude>sdk:sdk</exclude>
                                    <exclude>app:app</exclude>
                                    <exclude>util:util</exclude>
                                </excludes>
                            </artifactSet>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

修改代码如下

新增部分icon,可以在iconfont上下载即可
在这里插入图片描述
JsonView

package com.lhstack.aaa;

import com.alibaba.fastjson.JSON;
import com.intellij.codeInsight.actions.ReformatCodeProcessor;
import com.intellij.icons.AllIcons;
import com.intellij.json.json5.Json5Language;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.ex.FoldingModelEx;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.IconLoader;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.ui.LanguageTextField;
import org.apache.commons.lang.StringUtils;

import javax.swing.*;
import java.awt.*;

public class JsonView extends JPanel implements Runnable {

    private final Project project;
    private LanguageTextField languageTextField;

    public JsonView(Project project) {
        this.project = project;
        this.init();
    }

    private void init() {
        setLayout(new BorderLayout());
        languageTextField = new LanguageTextField(Json5Language.INSTANCE, project, "", false){
            @Override
            protected EditorEx createEditor() {
                EditorEx editor = super.createEditor();
                EditorSettings settings = editor.getSettings();
                settings.setRightMargin(-1);
                settings.setLineMarkerAreaShown(true);
                settings.setLineNumbersShown(true);
                settings.setLineCursorWidth(2);
                settings.setTabSize(4);
                settings.setUseTabCharacter(true);
                settings.setCaretInsideTabs(true);
                settings.setFoldingOutlineShown(true);
                super.resetKeyboardActions();
                return editor;
            }
        };
        this.add(languageTextField, BorderLayout.CENTER);
        this.initActions();
    }

    private void initActions() {
        DefaultActionGroup group = new DefaultActionGroup();


        group.add(new AnAction(() -> "全部展开", AllIcons.Actions.Expandall) {
            @Override
            public void actionPerformed(AnActionEvent event) {
                Editor editor = languageTextField.getEditor();
                if(editor instanceof EditorEx editorEx){
                    editorEx.getFoldingModel().runBatchFoldingOperation(() -> {
                        for (FoldRegion foldRegion : editorEx.getFoldingModel().getAllFoldRegions()) {
                            foldRegion.setExpanded(true);
                        }
                    });
                }
            }

            @Override
            public ActionUpdateThread getActionUpdateThread() {
                return ActionUpdateThread.BGT;
            }
        });

        group.add(new AnAction(() -> "全部收起", AllIcons.Actions.Collapseall) {
            @Override
            public void actionPerformed(AnActionEvent event) {
                Editor editor = languageTextField.getEditor();
                if(editor instanceof EditorEx editorEx){
                    editorEx.getFoldingModel().runBatchFoldingOperation(() -> {
                        for (FoldRegion foldRegion : editorEx.getFoldingModel().getAllFoldRegions()) {
                            foldRegion.setExpanded(false);
                        }
                    });
                }
            }

            @Override
            public ActionUpdateThread getActionUpdateThread() {
                return ActionUpdateThread.BGT;
            }
        });

        group.add(new AnAction(() -> "格式化", IconLoader.findIcon("icons/format.svg",JsonView.class)) {
            @Override
            public void actionPerformed(AnActionEvent event) {
                String text = languageTextField.getText();
                if(StringUtils.isNotBlank(text)){
                    PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(languageTextField.getDocument());
                    if(psiFile != null){
                        new ReformatCodeProcessor(psiFile,false).run();
                    }
                }
            }

            @Override
            public ActionUpdateThread getActionUpdateThread() {
                return ActionUpdateThread.BGT;
            }
        });

        group.add(new AnAction(() -> "压缩", IconLoader.findIcon("icons/compress.svg",JsonView.class)) {
            @Override
            public void actionPerformed(AnActionEvent event) {
                String text = languageTextField.getText();
                if(StringUtils.isNotBlank(text)){
                    try{
                        Object object = JSON.parse(text);
                        languageTextField.setText(JSON.toJSONString(object));
                    }catch (Throwable e){
                        Notifications.Bus.notify(new Notification("","格式化失败",e.toString(), NotificationType.ERROR),project);
                    }
                }
            }

            @Override
            public ActionUpdateThread getActionUpdateThread() {
                return ActionUpdateThread.BGT;
            }
        });
        ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar("ToolsPlugin@JsonView", group, true);
        actionToolbar.setTargetComponent(this);
        JComponent component = actionToolbar.getComponent();
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panel.add(component);
        this.add(panel, BorderLayout.NORTH);
    }

    @Override
    public void run() {
        Editor editor = languageTextField.getEditor();
        if(editor != null) {
            EditorFactory.getInstance().releaseEditor(editor);
        }
    }
}

PluginImpl

package com.lhstack.aaa;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.IconLoader;
import com.lhstack.tools.plugins.IPlugin;

import javax.swing.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

public class PluginImpl implements IPlugin {


    private final Map<String, Runnable> disposables = new HashMap<>();


    @Override
    public JComponent createPanel(Project project) {
        return (JComponent) disposables.computeIfAbsent(project.getLocationHash(), key -> {
            return new JsonView(project);
        });
    }


    @Override
    public void closeProject(String projectHash) {
        //关闭项目,移除项目对应打开的组件
        Optional.ofNullable(disposables.remove(projectHash)).ifPresent(Runnable::run);
    }

    @Override
    public void unInstall() {
        //清除缓存
        disposables.values().forEach(Runnable::run);

    }


    @Override
    public Icon pluginIcon() {
        return IconLoader.findIcon("logo.svg", PluginImpl.class);
    }

    @Override
    public Icon pluginTabIcon() {
        return IconLoader.findIcon("logo_tab.svg", PluginImpl.class);
    }

    @Override
    public String pluginName() {
        return "Json工具";
    }

    @Override
    public String pluginDesc() {
        return "这是一个Json工具";
    }

    @Override
    public String pluginVersion() {
        return "0.0.1";
    }
}

开发模块中运行

在这里插入图片描述
点击格式化
在这里插入图片描述
点击压缩
在这里插入图片描述
点击格式化,点击全部收起
在这里插入图片描述
点击全部展开
在这里插入图片描述
CTRL + F搜索
在这里插入图片描述

打包拖拽安装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/308347.html

相关文章:

  • win11 新建一个批处理,双击查看本机的IP地址
  • WordPress HTTPS 配置问题解决方案
  • Unity3D实现视频和模型融合效果
  • 什么是数字图像?
  • ubuntu ros 解决建完图后 保存的地图非常小的问题
  • Go开发指南-Gin与Web开发
  • 算法:76.最小覆盖子串
  • 文章-深入GPU硬件架构及运行机制 学习后记
  • 撤回仓库的提交
  • 基于SpringBoot实现SpringMvc上传下载功能实现
  • uniapp 如何自定义导航栏并自适应机型
  • 【ESP32】ESP-IDF开发 | 中断矩阵+按键输入中断例程
  • 发送成绩的app或小程序推荐
  • PTrade量化服务器连接openapi的地址、key等配置涉及哪些文件?
  • 【学习笔记】SSL密码套件之哈希
  • 【目标检测】labelimg图像标注软件的使用流程
  • 清华镜像源的使用说明
  • 文心一言 VS 讯飞星火 VS chatgpt (349)-- 算法导论23.2 8题
  • AI教你学Python :详解Python元组与集合、字典基础和字符串操作(补充)
  • JavaSE:8、包装类
  • seafaring寻找漏洞
  • 算法入门-贪心1
  • 【React】MobX
  • CI/CD持续集成和持续交付(git工具、gitlab代码仓库、jenkins)
  • DL/T645-2007 通信库(C#版本)
  • 裸金属服务器怎么实现算力共享,裸金属服务器提供者怎么做,租户怎样使用,共享平台需要搭建什么