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

news2024/11/16 4:11:39

介绍

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.coloradmin.cn/o/2143953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs 009: 使用nvm进行node版本管理(包括Could not retrieve的手动处理办法)

nvm 有些问题类似&#xff1a;“v8::Object::Set": No overloaded function accepts 2 Arguments”可能需要通过更换nodejs的版本来解决&#xff08;如下图所示&#xff0c;需要看当时的项目的时间&#xff0c;查找当时的流行nodejs版本&#xff09;。这时可以使用nvm进行…

干耳朵里的耳屎结坨了怎么弄出来?可视挖耳勺推荐

干耳朵里的耳屎结坨了怎么弄出来&#xff1f;这个是很多干耳朵小伙伴的一个难题。用棉签掏根本掏不出来&#xff0c;反而会越推越进。用普通耳勺掏不仅不够精准还会因为盲掏&#xff0c;弄伤自己的耳膜或者刮破耳道。所以干耳朵里的耳屎结坨了&#xff0c;建议用可视挖耳勺来掏…

robosuite基础教程(一)——基本概念

robosuite和robomimic都是由ARISE Initiative开发的开源工具&#xff0c;旨在推进机器人学习和机器人操作领域的研究。 一、基本概念 robosuite是一个由MuJoCo物理引擎驱动的模拟框架&#xff0c;专为机器人学习设计。它提供了一套基准环境&#xff0c;是Advancing Robot Int…

C++/CLI编程知识点小记

1.前言 本篇博文并非详细的C/CLI教程&#xff0c;仅是博主就学习和实践总结的部分知识点记录。 第一次接触C/CLI是2017年了&#xff0c;用C编写底层库&#xff0c;C/CLI编写wrapper层&#xff0c;在C#项目中进行调用&#xff0c;开发应用。 2.内容 C/CLI是一种混合编程&…

不要沉迷大模型的技术与理论,学习大模型的方法——从做一个小应用开始

“ 在应用中学习技术&#xff0c;而不是沉迷于技术本身 ” 不知道大家都是怎么学习大模型技术的&#xff0c;但从个人的经验和公众号的反馈来看&#xff0c;有些人在学习大模型技术时转进了牛角尖&#xff0c;导致很多东西学不明白&#xff0c;事倍功半。 今天就从个人的学习…

基于SpringBoot+Vue的校园礼服装租赁系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

Aigtek电压放大器用途有哪些方面

电压放大器是一种电子电路设备&#xff0c;主要用于将输入信号的电压放大到更大的幅度&#xff0c;增强信号的强度和质量。电压放大器具有广泛的应用领域&#xff0c;下面安泰电子将从以下几个方面详细介绍电压放大器的用途。 信号处理&#xff1a;电压放大器可以用于对各种信号…

Transformer 的可视化解释

Transformer 的可视化解释&#xff1a;了解 LLM Transformer 模型如何与交互式可视化配合使用 部署 Nodejs version > 20.0 git clone https://github.com/poloclub/transformer-explainer.git cd transformer-explainer npm install npm run dev# fix: cnpm install --pl…

物联网行业中小型嵌入式文件系统详解以及使用

一 概述 在嵌入式系统使用过程中&#xff0c;为了方便数据的存储&#xff0c;我们加入了串行的外部Flash(SPI通信)。在使用存储的时候&#xff0c;如需要记录一个字符串“奇迹物联Bloom OS”&#xff0c;我们可以把这些文字转化成 ASCII 码&#xff0c;存储在数组中&#xff0c…

激光模组多少钱一套?具体费用的决定因素

激光模组作为现代科技领域的重要组件&#xff0c;然而&#xff0c;对于许多潜在买家而言&#xff0c;激光模组的价格往往是一个令人困惑的问题。本文将跟大家一起探讨激光模组的价格范围及其具体费用的决定因素。 激光模组的价格范围 激光模组的价格因多种因素而异&#xff0c;…

基于Qt的串口调试工具串口常见问题

1.项目地址 https://github.com/zhangjiechina001/SerialPortTool 2.使用注意 串口的所有参数波特率、数据位、校验位、停止位、控制流都需要设置正确&#xff0c;设置错了有时会连接上但是传输的数据会很奇怪&#xff0c;有时直接连接不上了 3.串口通讯参数解释 串口通讯&a…

C++掉血迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…

7 款 Mac 剪贴板管理器帮助你改善工作流

大家都知道&#xff0c;Mac自带的剪贴板功能实在是太简陋了。复制一下、粘贴一下&#xff0c;就这么点能耐&#xff0c;简直就是个临时小仓库。 如果你经常需要复制粘贴各种内容&#xff0c;Mac原生的剪贴板可能反而会拖你的后腿。这时候&#xff0c;是时候升级一下你的剪贴板…

自有平台自有品牌如何利用电商API接口做定价参考(多平台商品详情数据接口)

如今&#xff0c;多数自有商城自有品牌在为产品做定价时都会参考淘宝|天猫|京东等主流电商平台的商品价格以做参考&#xff0c;这一行为的好处主要有以下几点&#xff1a; 通过参考主流平台价格&#xff0c;用户更能了解目标市场中消费者对产品的接受度&#xff0c;从而制定出符…

C++速通LeetCode简单第17题-爬楼梯(全网最简单)

思路要点&#xff1a;将问题转化为求斐波那契数列的第n项&#xff0c;然后迭代。 思路分析&#xff1a;最后一次爬的阶数不是1就是2&#xff0c;假设爬n阶的方法数是f(n)&#xff0c;假设最后一次爬1阶&#xff0c;那么爬前面的 n-1阶的方法数是f(n-1)&#xff1b;假设最后一次…

DepthCrafter:为开放世界视频生成一致的长深度序列

通过利用视频扩散模型&#xff0c;我们创新了一种新颖的视频深度估算方法–DepthCrafter。 它可以为开放世界视频生成具有细粒度细节的时间一致性长深度序列&#xff0c;而无需摄像机姿势或光流等附加信息。 简介 动机。 尽管在静态图像的单目深度估算方面取得了重大进展&…

Vue2集成高德地图遇到的几个问题

文章目录 前言集成地图实现的功能遇到的问题Uncaught Error: Invalid Object: LngLat(NaN, NaN)搜索结果不显示地图异步加载问题 写在最后 前言 几年没碰过前端了&#xff0c;最近闲来无事在捣鼓一个小项目&#xff0c;项目中一个功能涉及到地图组件&#xff0c;没想到在集成高…

敏捷项目管理:团队高效协作的关键

在当今快节奏的市场环境中&#xff0c;企业必须具备快速响应变化的能力。无论是产品研发、软件开发还是市场推广&#xff0c;灵活应对变化和高效管理项目已成为企业成功的关键。于是&#xff0c;敏捷开发这一理念越来越多地被各行业团队采纳&#xff0c;成为了他们高效协作、及…

git学习【持续更新中。。。】

git学习【持续更新中。。。】 文章目录 git学习【持续更新中。。。】一、Git基本操作1.创建本地仓库2.配置本地仓库1.局部配置2.全局配置 3.认识工作区、暂存区、版本库4.添加文件5.修改文件6.版本回退7.撤销修改8.删除文件9.理解分支10.创建、切换、合并分支11.删除分支12.合并…

B站开源长文本大模型:我很小但很能“装”

一、“2% GPT size, yet powerful.” 模型简介 Index-1.9B-32K 是一个拥有 1.9B &#xff08;19亿&#xff09;参数并具备 32K 上下文长度的语言模型&#xff08;这意味着&#xff0c;这个超小精灵可以一次性读完 3.5 万字以上的文档&#xff09;。 在多项长文本评测任务中&am…