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){@Overrideprotected 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) {@Overridepublic 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);}});}}@Overridepublic ActionUpdateThread getActionUpdateThread() {return ActionUpdateThread.BGT;}});group.add(new AnAction(() -> "全部收起", AllIcons.Actions.Collapseall) {@Overridepublic 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);}});}}@Overridepublic ActionUpdateThread getActionUpdateThread() {return ActionUpdateThread.BGT;}});group.add(new AnAction(() -> "格式化", IconLoader.findIcon("icons/format.svg",JsonView.class)) {@Overridepublic 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();}}}@Overridepublic ActionUpdateThread getActionUpdateThread() {return ActionUpdateThread.BGT;}});group.add(new AnAction(() -> "压缩", IconLoader.findIcon("icons/compress.svg",JsonView.class)) {@Overridepublic 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);}}}@Overridepublic 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);}@Overridepublic 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<>();@Overridepublic JComponent createPanel(Project project) {return (JComponent) disposables.computeIfAbsent(project.getLocationHash(), key -> {return new JsonView(project);});}@Overridepublic void closeProject(String projectHash) {//关闭项目,移除项目对应打开的组件Optional.ofNullable(disposables.remove(projectHash)).ifPresent(Runnable::run);}@Overridepublic void unInstall() {//清除缓存disposables.values().forEach(Runnable::run);}@Overridepublic Icon pluginIcon() {return IconLoader.findIcon("logo.svg", PluginImpl.class);}@Overridepublic Icon pluginTabIcon() {return IconLoader.findIcon("logo_tab.svg", PluginImpl.class);}@Overridepublic String pluginName() {return "Json工具";}@Overridepublic String pluginDesc() {return "这是一个Json工具";}@Overridepublic String pluginVersion() {return "0.0.1";}
}

开发模块中运行

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

打包拖拽安装

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/431136.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Q必达任务脚本

文章目录 1.购买服务器地址2.部署教程3. 代码如下4. 如何联系我 1.购买服务器地址 服务器购买地址 https://t.aliyun.com/U/rUHk58 若失效&#xff0c;可用地址 https://www.aliyun.com/activity/wuying/dj?source5176.29345612&userCode49hts92d 2.部署教程 2024年最…

鸿蒙OpenHarmony【小型系统基础内核(进程管理任务)】子系统开发

任务 基本概念 从系统的角度看&#xff0c;任务Task是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它任务运行。 OpenHarmony 内核中使用一个任务表示一个线程。 OpenHarmony 内核中同优先级进程内的任务统一调度、运…

群晖使用Docker部署WPS Office并实现异地使用浏览器制作办公文档

文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 想象一下这个场景&#xff1a;如果遇到周末紧急需要改方案&#xff0c;但团队成员都在各自家中&#xff0c;这个时候如果大家能够轻松访问这个…

Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)

Unity 3D GUI 简介 游戏开发过程中&#xff0c;开发人员往往会通过制作大量的图形用户界面&#xff08; Graphical User Interface&#xff0c;GUI &#xff09;来增强游戏与玩家的交互性。 Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI等&#xff0c;这些类型的图形系统内容…

仓颉编程入门2,启动HTTP服务

上一篇配置了仓颉sdk编译和运行环境&#xff0c;读取一个配置文件&#xff0c;并把配置文件简单解析了一下。 前面读取配置文件&#xff0c;使用File.readFrom()&#xff0c;这个直接把文件全部读取出来&#xff0c;返回一个字节数组。然后又创建一个字节流&#xff0c;给文件…

Apache James配置连接达梦数据库

项目场景&#xff1a; Apache James配置连接达梦数据库&#xff0c;其他配置中不存在的数据库也可参考此方案。 配置步骤 1、把需要的jar包导入到James 把DmJdbcDriver18.jar复制到下面lib目录下 james-2.3.2\lib 2、 修改连接配置 james-2.3.2\apps\james\SAR-INF\confi…

Dockerfile部署xxljob

使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时&#xff0c;通常会使用xxljob容器化部署xxljob&#xff0c;通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说&#xff0c;没有任何问题。但是在arm架构的服…

springboot项目引入了第三方jar包

应该把jar包放在resource目录下&#xff0c;新建一个lib目录放进去&#xff0c;不然打包的时候会报错找不到jar包&#xff0c;放入jar包&#xff0c;右键添加到库&#xff0c;才可以使用。 _g().startMarquee();

MapReduce基本原理

目录 整体执行流程​ Map端执行流程 Reduce端执行流程 Shuffle执行流程 整体执行流程 八部曲 读取数据--> 定义map --> 分区 --> 排序 --> 规约 --> 分组 --> 定义reduce --> 输出数据 首先将文件进行切片&#xff08;block&#xff09;处理&#xff…

【C语言】猜数字游戏

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 前言1. 随机数生成1.1 rand1.2 srand1.3 time1.4 设置随机数的范围 2. 猜数字游戏实现2.1 游戏菜单2.2 主函数部分2.3 game函数部分2.4 附代码2.5 优化代码 前言 前面学习的这些知识&#xff0c;我们就可以写一些稍微…

常见统计量与其抽样分布

什么是统计量 我们首先给出统计量的定义:设 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X1​,X2​,⋯,Xn​ 为来自于总体X的一个样本&#xff0c; g ( X 1 , X 2 , ⋯ , X n ) g(X_1,X_2,\cdots,X_n) g(X1​,X2​,⋯,Xn​) 为关于 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X…

C++ STL容器(三) —— 迭代器底层剖析

本篇聚焦于STL中的迭代器&#xff0c;同样基于MSVC源码。 文章目录 迭代器模式应用场景实现方式优缺点 UML类图代码解析list 迭代器const 迭代器非 const 迭代器 vector 迭代器const 迭代器非const迭代器 反向迭代器 迭代器失效参考资料 迭代器模式 首先迭代器模式是设计模式中…

linux网络编程7

24.9.24学习目录 一.网络通信过程&#xff08;续&#xff09;1.路由器 二.原始套接字&#xff08;SOCK_RAW&#xff09;1.创建原始套接字2.数据包解析 一.网络通信过程&#xff08;续&#xff09; 1.路由器 路由器是用于连接多个逻辑上分开的网络&#xff1b; 具有判断网络地…

React-Native 中使用 react-native-image-crop-picker 在华为手机上不能正常使用拍照功能

背景: React-Native 0.66 中使用 react-native-image-crop-picker 在安卓 华为手机上不能正常使用拍照功能, 其他品牌正常 代码如下: import ImagePicker from react-native-image-crop-picker;ImagePicker.openCamera(photoOptions).then(image > {callback(image);}) …

不靠学历,不拼年资,怎么才能月入2W?

之前统计局发布了《2023年城镇单位就业人员年平均工资情况》&#xff0c;2023年全国城镇非私营单位和私营单位就业人员年平均工资分别为120698元和68340元。也就是说在去年非私营单位就业人员平均月薪1W&#xff0c;而私营单位就业人员平均月薪只有5.7K左右。 图源&#xff1a;…

DownShift: Tuning Shift Reduction With Reliability for Racetrack Memories

目录 DownShift: Tuning Shift Reduction With Reliability for Racetrack Memories文章摘要&#xff1a;文章的主要贡献包括&#xff1a;文章的结构如下&#xff1a;DownShiftDownShift通过以下方式改进了现有的数据放置策略&#xff1a; GROGU&#xff08;Generating Reliabi…

简单题94. 二叉树的中序遍历 (python)20240921

问题描述&#xff1a; python&#xff1a; # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution(object…

【重学 MySQL】三十七、聚合函数

【重学 MySQL】三十七、聚合函数 基本概念5大常用的聚合函数COUNT()SUM()AVG()MAX()MIN() 使用场景注意事项示例查询 聚合函数&#xff08;Aggregate Functions&#xff09;在数据库查询中扮演着至关重要的角色&#xff0c;特别是在处理大量数据时。它们能够对一组值执行计算&a…

图书管理系统实现

图书管理系统实现 图书管理系统作用图书管理系统绘图创建Book创建BookListOperation包下代码User包AdminUserNomalUser Main方法整体代码&#xff08;带有注释&#xff09;Opertaion包下的代码IOpertaion&#xff08;接口&#xff09;Add添加图书代码Dele删除图书代码Borrow借阅…

PyTorch 池化层详解

在深度学习中&#xff0c;池化层&#xff08;Pooling Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量&#xff0c;同时增强模型的鲁棒性。本文将详细介绍池化层的作用、种类、实现方法&#xf…