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.xdnf.cn/news/143323.html

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

相关文章

C++源代码封装成dll动态链接库,并在WPF项目中使用的步骤说明

文章目录 1. 创建并生成C的DLL&#xff08;C动态链接库&#xff09;&#xff08;1&#xff09;新建项目-->开发语言选定C&#xff0c;在搜索栏搜索“动态链接库”-->配置项目名称和路径-->添加类&#xff0c;此处命名为My_C_Class&#xff08;2)实现类的功能&#xff…

Logstash 安装与部署(无坑版)

下载 版本对照关系&#xff1a;ElasticSearch 7.9.2 和 Logstash 7.9.2 &#xff1b; 官方下载地址 选择ElasticSearch版本一致的Logstash版本 https://www.elastic.co/cn/downloads/logstash 下载链接&#xff1a;https://artifacts.elastic.co/downloads/logstash/logst…

Flask-WTF的使用

组织一个 Flask 项目通常需要遵循一定的结构&#xff0c;以便代码清晰、可维护。下面是一个典型的 Flask 项目结构&#xff1a; my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── templat…

什么样的无线麦克风好?罗德、西圣、优篮子无线麦克风实测对比

在这个人人都在用短视频分享记录生活的时代&#xff0c;拍摄生活Vlog和短视频已经深入我们生活的方方面面&#xff0c;美食分享、搞笑视频以及直播等等&#xff0c;不过既然说到视频创作&#xff0c;那么光有好的内容画面肯定是远远不够的&#xff0c;试想一段视频里杂音不断&a…

单片机带隙电压基准电路

单片机带隙电压基准电路 一、带隙电压基准电路概述 带隙电压基准电路在单片机中占据着至关重要的地位。它能够为各种模拟集成电路提供稳定的参考电压&#xff0c;确保电路的正常运行。例如&#xff0c;在高精度的比较器中&#xff0c;带隙电压基准电路可以提供一个精确的参考…

【可测试性实践】C++单元测试:gtest gmock

引言 google test是目前C主流的单元测试框架&#xff0c;本文介绍如何在工程引入gtest和gmock&#xff0c;并提供入门参考示例。根据黄金圈思维我们先思考Why&#xff08;为什么做&#xff09;&#xff0c;为什么我们要进行单元测试&#xff0c;为什么要引入mock手段来测试代码…

IBM中国研发部裁员:全球化背景下的中国IT产业挑战与机遇

文章目录 每日一句正能量前言整体分析人才发展裁员对中国IT人才市场的影响&#xff1a;IT从业者提升竞争力的策略&#xff1a; 产业未来后记 每日一句正能量 一切美好的事物都是曲折地接近自己的目标&#xff0c;一切笔直都是骗人的&#xff0c;所有真理都是弯曲的&#xff0c;…

设计一个高质量的API接口:提升应用性能的关键步骤

在当今的软件开发世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;接口扮演着至关重要的角色。一个设计精良的API不仅能够提高开发效率&#xff0c;还能提升用户体验&#xff0c;并确保系统的可扩展性和安全性。本文将探讨如何设计一个高质量的API接口&#xff…

蓝卓标杆客户镇洋发展,荣获IDC中国未来企业大奖

9月11-12日&#xff0c;2024 IDC中国年度盛典暨颁奖典礼在上海正式举办&#xff0c;年度盛典公布了2024 IDC中国未来企业大奖等系列奖项&#xff0c;以此表彰不同机构/组织/个人在数字化转型大背景下的努力与成绩。 其中&#xff0c;浙江镇洋发展股份有限公司&#xff08;以下简…

【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…

Gradio导入AIGC大模型创建web端智能体聊天机器人,python(2)

Gradio导入AIGC大模型创建web端智能体聊天机器人&#xff0c;python&#xff08;2&#xff09; 选用这个大模型&#xff1a; https://huggingface.co/HuggingFaceTB/SmolLM-1.7B-Instructhttps://huggingface.co/HuggingFaceTB/SmolLM-1.7B-Instruct原因是该模型相对比较小&am…

使用Dev-C++实现比大小的C语言程序

使用Dev-C++实现比大小的C语言程序 引言一、Dev-C++开发环境简介与安装1.1 Dev-C++简介1.2 Dev-C++安装步骤二、初识C语言与Dev-C++的使用2.1 C语言基础2.2 创建一个新的C项目2.3 编写简单的C程序2.4 编译与运行三、编写比大小的C程序3.1 程序需求3.2 程序设计3.3 编写代码3.4 …

dubbo三

dubbo dubbo架构各层说明 URL举例解析 消费者引用服务过程 项目初始化

.ideavimrc在idea打不开

### bug修复 自己不知道搞了啥导致.ideavimrc文件打不开&#xff0c;如图点击无反应 ![[Pasted image 20240917004710.png|400]] 后面发现是格式类型的错误 参考[这篇文章](https://blog.csdn.net/qq_41147260/article/details/85002668) **修复** - AltCtrls 打开设置 - Edi…

win11:重命名文件自动改变位置

你用的系统有个小bug 就是在桌面上重命名文件之后 文件会自动跳转到左上角 有些不注意的以为文件丢了 分类摆放好的文件 重命名之后还得拉回原来的位置 其实简单设置一下 就可以修复这个小bug 1、我们找到设置 在搜索栏搜索“个性化”&#xff0c;选择---‘开始’菜单设置 2、…

【北京迅为】《STM32MP157开发板使用手册》- 第三十一章Cortex-M4窗口看门狗实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

java进销存系统源码:管店云进销存解决方案

在当今数字化转型的大背景下&#xff0c;企业对高效、可靠的进销存管理系统的需求日益增长。Java作为一种广泛使用的编程语言&#xff0c;以其成熟的技术栈和强大的生态系统&#xff0c;成为了开发高性能进销存系统的首选语言之一。本文将介绍一款基于Java进销存系统源码的“管…

yolov5s网络结构

鉴于网上关于yolov5s的解读众多然不尽相同&#xff0c;特从YOLOv5官方项目地址&#xff1a;https://github.com/ultralytics/yolov5下载了yolov5的各版本文件并上传至 [资源] 栏目&#xff0c;这里就yolov5s版本的网络结构进行分析展示。 1、yolov5s模型的yaml文件 # Ultralyt…

Git使用教程-将idea本地文件配置到gitte上的保姆级别步骤

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

基于LangChain的Embedding开发手册(保姆级)

前言 时至今日&#xff0c;经过2年的“攻城拔寨”&#xff0c;大模型显然吹进了“寻常百姓家”。如果你还不了解ChatGPT&#xff0c;不了解通义、文心、混元等国内任意一款大模型产品&#xff0c;那么请来博主这里坐坐&#xff0c;我们“边看边聊”。 随着ChatGPT的问世&#…