diff --git a/README.md b/README.md index ad9c45fd4136e67343a1fde160694cad420b45f6..f00fc92bf4c46e2331bd0700598f6c4dd804f748 100644 --- a/README.md +++ b/README.md @@ -32,4 +32,10 @@ 1、APT自动编译 -2、APT内容提示 \ No newline at end of file +2、APT内容提示 + +### 五、视频演示 + +1 、[基础演示](https://www.bilibili.com/video/BV1yV411g7Yd/?vd_source=b6f434af852a6a39fcd34fc2de5cf431) + +2 、[新增功能演示](https://www.bilibili.com/video/BV1hj411d7Rq/?vd_source=b6f434af852a6a39fcd34fc2de5cf431) \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index fbf4ff819c585db7a677e4ced19b27f7744e131b..5317d6035a7471bbbef1d831f21457a82a4d782f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "com.mybatisflex.plugin" -version = "1.4.3-RELEASE" +version = "1.4.4-RELEASE" repositories { maven { @@ -19,8 +19,8 @@ repositories { // Configure Gradle IntelliJ Plugin // Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html intellij { -// version.set("2022.2.5") - version.set("2020.3.4") + version.set("2022.2.5") +// version.set("2020.3.3") type.set("IU") // Target IDE Platform plugins.set(listOf("com.intellij.java", "org.jetbrains.kotlin", "IntelliLang", "com.intellij.database")) } @@ -30,8 +30,8 @@ dependencies { implementation("cn.hutool:hutool-core:5.8.20") } java { - sourceCompatibility = JavaVersion.VERSION_16 - targetCompatibility = JavaVersion.VERSION_16 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } tasks { diff --git a/src/main/java/club/bigtian/mf/plugin/action/flex/AutoCompileAction.java b/src/main/java/club/bigtian/mf/plugin/action/flex/AutoCompileAction.java new file mode 100644 index 0000000000000000000000000000000000000000..7474462f4a0e9ad7d2acab0d2ef1b432d66592ce --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/action/flex/AutoCompileAction.java @@ -0,0 +1,53 @@ +package club.bigtian.mf.plugin.action.flex; + +import club.bigtian.mf.plugin.core.util.CompilerManagerUtil; +import club.bigtian.mf.plugin.core.util.Modules; +import club.bigtian.mf.plugin.core.util.ProjectUtils; +import cn.hutool.core.util.ObjectUtil; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.FileIndex; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; + +import java.util.ArrayList; +import java.util.List; + +public class AutoCompileAction extends AnAction { + + @Override + public void actionPerformed(AnActionEvent e) { + Project project = e.getProject(); + ProjectUtils.setCurrentProject(project); + Module[] modules = Modules.getModule(project); + PsiManager psiManager = PsiManager.getInstance(project); + List virtualFiles = new ArrayList<>(); + for (Module module : modules) { + FileIndex fileIndex = ModuleRootManager.getInstance(module).getFileIndex(); + fileIndex.iterateContent(fileOrDir -> { + if (fileOrDir.isDirectory() && (fileIndex.isUnderSourceRootOfType(fileOrDir, JavaModuleSourceRootTypes.SOURCES))) { + PsiDirectory psiDirectory = psiManager.findDirectory(fileOrDir); + String path = psiDirectory.getVirtualFile().getPath(); + if (!path.contains("src/main")) { + return true; + } + PsiElement firstChild = psiDirectory.getFirstChild(); + if (ObjectUtil.isNotNull(firstChild) && firstChild.getText().contains("@Table")) { + for (PsiFile file : psiDirectory.getFiles()) { + virtualFiles.add(file.getVirtualFile()); + } + } + } + return true; + }); + } + CompilerManagerUtil.compile(virtualFiles.toArray(new VirtualFile[virtualFiles.size()]),null); + } +} diff --git a/src/main/java/club/bigtian/mf/plugin/action/flex/SQLPreviewAction.java b/src/main/java/club/bigtian/mf/plugin/action/flex/SQLPreviewAction.java new file mode 100644 index 0000000000000000000000000000000000000000..d5b32606ff740ab69f7ce9634fc47ecd1a69bef5 --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/action/flex/SQLPreviewAction.java @@ -0,0 +1,108 @@ +package club.bigtian.mf.plugin.action.flex; + +import club.bigtian.mf.plugin.core.function.SimpleFunction; +import club.bigtian.mf.plugin.core.log.MyBatisLogExecutor; +import club.bigtian.mf.plugin.core.util.CodeReformat; +import club.bigtian.mf.plugin.core.util.CompilerManagerUtil; +import club.bigtian.mf.plugin.core.util.ProjectUtils; +import club.bigtian.mf.plugin.windows.SQLPreviewDialog; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.intellij.execution.*; +import com.intellij.execution.configurations.JavaCommandLineState; +import com.intellij.execution.configurations.JavaParameters; +import com.intellij.execution.process.ProcessAdapter; +import com.intellij.execution.process.ProcessEvent; +import com.intellij.execution.process.ProcessHandler; +import com.intellij.execution.process.ProcessOutputTypes; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.runners.ProgramRunner; +import com.intellij.ide.highlighter.JavaFileType; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; + +public class SQLPreviewAction { + + private static final Logger LOG = Logger.getInstance(SQLPreviewAction.class); + + SimpleFunction function; + public void preview(String selectedText, PsiJavaFile psiFile, SimpleFunction function) { + this.function = function; + String variable = StrUtil.subBetween(selectedText, "QueryWrapper ", " ="); + selectedText += StrUtil.format("\nSystem.out.println({}.toSQL());", variable); + String text = "public class MybatisFlexSqlPreview {\n public static void main(String[] args) {" + selectedText + "\n}\n}"; + Project project = ProjectUtils.getCurrentProject(); + String packageName = psiFile.getPackageName(); + PsiJavaFile psiJavaFile = (PsiJavaFile) PsiFileFactory.getInstance(project).createFileFromText("MybatisFlexSqlPreview.java", JavaFileType.INSTANCE, text); + psiJavaFile.setPackageName(psiFile.getPackageName()); + PsiImportList importList = psiFile.getImportList(); + if (ObjectUtil.isNotNull(importList)) { + psiJavaFile.getImportList().add(importList); + } + PsiDirectory containingDirectory = psiFile.getContainingDirectory(); + WriteCommandAction.runWriteCommandAction(project, () -> { + try { + PsiFile file = containingDirectory.findFile(psiJavaFile.getName()); + if (ObjectUtil.isNotNull(file)) { + file.delete(); + } + PsiElement element = containingDirectory.add(CodeReformat.reformat(psiJavaFile)); + VirtualFile virtualFile = element.getContainingFile().getVirtualFile(); + showSql(project, packageName, virtualFile); + } catch (Exception e) { + LOG.error("SQLPreviewAction error", e); + } + }); + } + + + private void showSql(Project project, String packageName, VirtualFile virtualFile) { + CompilerManagerUtil.compile(new VirtualFile[]{virtualFile}, (b, i, i1, compileContext) -> { + try { + // 执行配置 + ProgramRunner runner = ProgramRunner.PROGRAM_RUNNER_EP.getExtensions()[0]; + Executor instance = MyBatisLogExecutor.getInstance(); + RunManagerEx runManager = (RunManagerEx) RunManager.getInstance(project); + RunnerAndConfigurationSettings defaultSettings = runManager.getSelectedConfiguration(); + ExecutionEnvironment environment = new ExecutionEnvironment(instance, runner, defaultSettings, project); + // 创建 Java 执行配置 + JavaCommandLineState commandLineState = new JavaCommandLineState(environment) { + @Override + protected JavaParameters createJavaParameters() throws ExecutionException { + JavaParameters params = new JavaParameters(); + Sdk projectSdk = ProjectRootManager.getInstance(project).getProjectSdk(); + params.configureByProject(project, JavaParameters.JDK_AND_CLASSES, projectSdk); + params.setMainClass(packageName + ".MybatisFlexSqlPreview"); + return params; + } + }; + ExecutionResult executionResult = commandLineState.execute(instance, runner); + if (ObjectUtil.isNotNull(executionResult) && ObjectUtil.isNotNull(executionResult)) { + ProcessHandler processHandler = executionResult.getProcessHandler(); + processHandler.addProcessListener(new ProcessAdapter() { + @Override + public void onTextAvailable(ProcessEvent event1, Key outputType) { + if (ProcessOutputTypes.STDOUT.equals(outputType)) { + new SQLPreviewDialog(event1.getText(), virtualFile).setVisible(true); + function.apply(); + } else if (ProcessOutputTypes.STDERR.equals(outputType)) { + System.out.println(event1.getText()); + } + } + }); + processHandler.startNotify(); + } + } catch ( + Exception e) { + Messages.showErrorDialog("Error executing code:\n" + e.getMessage(), "Code Execution Error"); + } + }); + } +} diff --git a/src/main/java/club/bigtian/mf/plugin/core/MybatisFlexDocumentChangeHandler.java b/src/main/java/club/bigtian/mf/plugin/core/MybatisFlexDocumentChangeHandler.java index de5a4d58cd5a59916384d680e45a76af606bc689..88e213726fcfe7ac9a660ac0f7c2ba8f7e203c12 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/MybatisFlexDocumentChangeHandler.java +++ b/src/main/java/club/bigtian/mf/plugin/core/MybatisFlexDocumentChangeHandler.java @@ -1,14 +1,11 @@ package club.bigtian.mf.plugin.core; -import club.bigtian.mf.plugin.core.util.KtFileUtil; -import club.bigtian.mf.plugin.core.util.PsiJavaFileUtil; -import club.bigtian.mf.plugin.core.util.VirtualFileUtils; +import club.bigtian.mf.plugin.core.util.*; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.compiler.CompilerManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -33,7 +30,7 @@ import java.util.Set; /** * @author bigtian */ -public class MybatisFlexDocumentChangeHandler implements DocumentListener, EditorFactoryListener , Disposable { +public class MybatisFlexDocumentChangeHandler implements DocumentListener, EditorFactoryListener, Disposable { private static final Logger LOG = Logger.getInstance(MybatisFlexDocumentChangeHandler.class); private static final Key CHANGE = Key.create("change"); private static final Key LISTENER = Key.create("listener"); @@ -43,7 +40,10 @@ public class MybatisFlexDocumentChangeHandler implements DocumentListener, Edito // 所有的文档监听 EditorFactory.getInstance().getEventMulticaster().addDocumentListener(this, this); Document document; + for (Editor editor : EditorFactory.getInstance().getAllEditors()) { + ProjectUtils.setCurrentProject(editor.getProject()); + document = editor.getDocument(); document.putUserData(LISTENER, true); editor.addEditorMouseListener(new EditorMouseListener() { @@ -58,7 +58,6 @@ public class MybatisFlexDocumentChangeHandler implements DocumentListener, Edito @Override public void editorReleased(@NotNull EditorFactoryEvent event) { Editor editor = event.getEditor(); - Document document = editor.getDocument(); if (Boolean.TRUE.equals(document.getUserData(LISTENER))) { document.putUserData(LISTENER, false); @@ -81,6 +80,7 @@ public class MybatisFlexDocumentChangeHandler implements DocumentListener, Edito document.putUserData(LISTENER, true); document.addDocumentListener(this); } + ProjectUtils.setCurrentProject(editor.getProject()); } private void executeCompile(Editor editor) { @@ -146,11 +146,8 @@ public class MybatisFlexDocumentChangeHandler implements DocumentListener, Edito } private void compile(@NotNull Editor editor) { - Project project = editor.getProject(); - CompilerManager compilerManager = CompilerManager.getInstance(project); VirtualFile currentFile = VirtualFileUtils.getVirtualFile(editor.getDocument()); - LOG.warn("编译文件: " + currentFile.getName()); - compilerManager.compile(new VirtualFile[]{currentFile}, null); + CompilerManagerUtil.compile(new VirtualFile[]{currentFile}, null); } diff --git a/src/main/java/club/bigtian/mf/plugin/core/RenderMybatisFlexTemplate.java b/src/main/java/club/bigtian/mf/plugin/core/RenderMybatisFlexTemplate.java index 6a3448dcf7432a636b618602a2a4e1b0158e819b..3212e78c7efedccd0e5cc7e9ddfa9a578863a37f 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/RenderMybatisFlexTemplate.java +++ b/src/main/java/club/bigtian/mf/plugin/core/RenderMybatisFlexTemplate.java @@ -1,10 +1,7 @@ package club.bigtian.mf.plugin.core; import club.bigtian.mf.plugin.core.config.MybatisFlexConfig; -import club.bigtian.mf.plugin.core.util.CodeReformat; -import club.bigtian.mf.plugin.core.util.Modules; -import club.bigtian.mf.plugin.core.util.TableCore; -import club.bigtian.mf.plugin.core.util.VirtualFileUtils; +import club.bigtian.mf.plugin.core.util.*; import club.bigtian.mf.plugin.entity.ColumnInfo; import club.bigtian.mf.plugin.entity.TableInfo; import cn.hutool.core.util.ObjectUtil; @@ -20,7 +17,10 @@ import com.intellij.openapi.ui.Messages; import com.intellij.psi.*; import com.intellij.util.IncorrectOperationException; import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; import org.apache.velocity.app.VelocityEngine; +import org.apache.velocity.runtime.RuntimeConstants; +import org.apache.velocity.runtime.log.NullLogChute; import org.jetbrains.annotations.Nullable; import java.io.StringWriter; @@ -40,6 +40,8 @@ public class RenderMybatisFlexTemplate { public static void assembleData(List selectedTableInfo, MybatisFlexConfig config, @Nullable Project project) { VelocityEngine velocityEngine = new VelocityEngine(); + //修复因velocity.log拒绝访问,导致Velocity初始化失败 + velocityEngine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM, new NullLogChute()); VelocityContext context = new VelocityContext(); HashMap> templateMap = new HashMap<>(); Map templates = new ConcurrentHashMap<>(config.getTemplates()); @@ -81,7 +83,7 @@ public class RenderMybatisFlexTemplate { // 如果勾选了覆盖,则删除原有文件 if (config.isOverrideCheckBox()) { for (PsiElement psiFile : list) { - if (psiFile instanceof PsiFile ) { + if (psiFile instanceof PsiFile) { PsiFile file = (PsiFile) psiFile; PsiFile directoryFile = directory.findFile(file.getName()); if (ObjectUtil.isNotNull(directoryFile)) { @@ -110,7 +112,8 @@ public class RenderMybatisFlexTemplate { }); } }); - + //生成代码之后,重新构建 + CompilerManagerUtil.make(Modules.getModule(config.getModelModule())); } private static void logicDelete(List selectedTableInfo, MybatisFlexConfig config) { diff --git a/src/main/java/club/bigtian/mf/plugin/core/annotator/MybatisFlexConfigAnnotator.java b/src/main/java/club/bigtian/mf/plugin/core/annotator/MybatisFlexConfigAnnotator.java new file mode 100644 index 0000000000000000000000000000000000000000..b980bd5184668a7cf59727bd2b904b3890e78ff6 --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/core/annotator/MybatisFlexConfigAnnotator.java @@ -0,0 +1,42 @@ +package club.bigtian.mf.plugin.core.annotator; + +import club.bigtian.mf.plugin.core.render.SqlPreviewIconRenderer; +import com.intellij.lang.annotation.AnnotationBuilder; +import com.intellij.lang.annotation.AnnotationHolder; +import com.intellij.lang.annotation.Annotator; +import com.intellij.lang.annotation.HighlightSeverity; +import com.intellij.openapi.editor.Document; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiJavaFile; + +import java.util.HashMap; +import java.util.Map; + +public class MybatisFlexConfigAnnotator implements Annotator { + private Map iconMap = new HashMap<>(); + + @Override + public void annotate(PsiElement element, AnnotationHolder holder) { + // 获取当前行号 + Document document = PsiDocumentManager.getInstance(element.getProject()).getDocument(element.getContainingFile()); + int offset = element.getTextOffset(); + int lineNumber = document.getLineNumber(offset) + 1; + if (lineNumber == 0) { + return; + } + + String text = element.getText(); + if (text.startsWith("QueryWrapper") && text.endsWith(";") && !iconMap.keySet().contains(lineNumber)) { + iconMap.put(lineNumber, text); + // 创建图标注解 + AnnotationBuilder annotationBuilder = holder.newSilentAnnotation(HighlightSeverity.INFORMATION); + annotationBuilder.gutterIconRenderer(new SqlPreviewIconRenderer(lineNumber, (PsiJavaFile) element.getContainingFile(),iconMap)); + annotationBuilder.create(); + + } + } + + + +} \ No newline at end of file diff --git a/src/main/java/club/bigtian/mf/plugin/core/config/MybatisFlexConfig.java b/src/main/java/club/bigtian/mf/plugin/core/config/MybatisFlexConfig.java index f513f93a6e491babcfab3d8f528d38c227865b4d..764f1304574019ea8daa3eed5824a8d6c6bac590 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/config/MybatisFlexConfig.java +++ b/src/main/java/club/bigtian/mf/plugin/core/config/MybatisFlexConfig.java @@ -184,6 +184,8 @@ public class MybatisFlexConfig { private String xmlPath; private String mapperPath; + private boolean accessors; + public Map getSuffix() { Map data = new HashMap<>(); data.put(MybatisFlexConstant.CONTROLLER, ObjectUtil.defaultIfBlank(controllerSuffix, MybatisFlexConstant.CONTROLLER)); @@ -603,4 +605,12 @@ public class MybatisFlexConfig { public void setMapperPath(String mapperPath) { this.mapperPath = mapperPath; } + + public boolean getAccessors() { + return accessors; + } + + public void setAccessors(boolean accessors) { + this.accessors = accessors; + } } diff --git a/src/main/java/club/bigtian/mf/plugin/core/constant/MybatisFlexConstant.java b/src/main/java/club/bigtian/mf/plugin/core/constant/MybatisFlexConstant.java index 462d34550d1550d1810f80ddc8efe248336c7d75..056a116975e1db3a467705aa2edc123a3ead9cff 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/constant/MybatisFlexConstant.java +++ b/src/main/java/club/bigtian/mf/plugin/core/constant/MybatisFlexConstant.java @@ -17,6 +17,7 @@ public class MybatisFlexConstant { public static final String MAPPER_TEMPLATE = "mapperTemplate.java"; public static final String XML_TEMPLATE = "xmlTemplate.xml"; public static final String LOMBOK_BUILDER = "builder"; + public static final String LOMBOK_ACCESSORS = "accessors"; public static final String LOMBOK_DATA = "data"; public static final String LOMBOK_ALL_ARGS_CONSTRUCTOR = "allArgsConstructor"; public static final String LOMBOK_NO_ARGS_CONSTRUCTOR = "noArgsConstructor"; diff --git a/src/main/java/club/bigtian/mf/plugin/core/contributor/MybatisFlexCompletionContributor.java b/src/main/java/club/bigtian/mf/plugin/core/contributor/MybatisFlexCompletionContributor.java index 3f15dcfe87e85eba6f80330cb317445bbf6cdd63..1a79ff24d21555b6cacf7f61b629e805a3f8ef64 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/contributor/MybatisFlexCompletionContributor.java +++ b/src/main/java/club/bigtian/mf/plugin/core/contributor/MybatisFlexCompletionContributor.java @@ -111,7 +111,7 @@ public class MybatisFlexCompletionContributor extends CompletionContributor { for (Map.Entry entry : tableDefMap.entrySet()) { // 添加补全提示 LookupElement lookupElement = LookupElementBuilder.create(entry.getKey()) - .withTypeText(StrUtil.subAfter(entry.getValue(), ".", true) + "(MybatisFlex-Hepler)", true) + .withTypeText(StrUtil.subAfter(entry.getValue(), ".", true) + "(MybatisFlex-Helpler)", true) .withInsertHandler((context, item) -> { // 选中后的处理事件 PsiClass psiClass = psiFacade.findClass(entry.getValue(), GlobalSearchScope.projectScope(project)); diff --git a/src/main/java/club/bigtian/mf/plugin/core/contributor/MybatisFlexConfigCompletionContributor.java b/src/main/java/club/bigtian/mf/plugin/core/contributor/MybatisFlexConfigCompletionContributor.java new file mode 100644 index 0000000000000000000000000000000000000000..95c654993c3f3bc59fd1c2fb3c87ad4fac8d1d8f --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/core/contributor/MybatisFlexConfigCompletionContributor.java @@ -0,0 +1,175 @@ +package club.bigtian.mf.plugin.core.contributor; + +import club.bigtian.mf.plugin.core.icons.Icons; +import club.bigtian.mf.plugin.core.util.VirtualFileUtils; +import club.bigtian.mf.plugin.entity.MybatisFlexConfgInfo; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.intellij.codeInsight.completion.CompletionContributor; +import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.CompletionResultSet; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.LogicalPosition; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiElementFactory; +import com.intellij.psi.PsiManager; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * mybatis-flex.config 补全提示 + * Author: BigTian + */ +public class MybatisFlexConfigCompletionContributor extends CompletionContributor { + private static final Logger LOG = Logger.getInstance(MybatisFlexConfigCompletionContributor.class); + PsiElementFactory elementFactory; + JavaPsiFacade psiFacade; + PsiManager psiManager; + public static Map CONFIG_MAP = new ConcurrentHashMap<>(); + + static { + CONFIG_MAP.put("processor.enable=", new MybatisFlexConfgInfo(Arrays.asList("true", "false"), "全局启用apt开关")); + CONFIG_MAP.put("processor.stopBubbling=", new MybatisFlexConfgInfo(Arrays.asList("true", "false"), "是否停止向上级合并配")); + CONFIG_MAP.put("processor.genPath=", new MybatisFlexConfgInfo(Arrays.asList(""), "APT 代码生成路径")); + CONFIG_MAP.put("processor.charset=", new MybatisFlexConfgInfo(Arrays.asList(""), "APT 代码生成文件字符集")); + CONFIG_MAP.put("processor.allInTables.enable=", new MybatisFlexConfgInfo(Arrays.asList("true", "false"), "是否所有的类都生成在 Tables 类里")); + CONFIG_MAP.put("processor.allInTables.package=", new MybatisFlexConfgInfo(Arrays.asList(""), "Tables 包名")); + CONFIG_MAP.put("processor.allInTables.className=", new MybatisFlexConfgInfo(Arrays.asList(""), "Tables 类名")); + CONFIG_MAP.put("processor.mapper.generateEnable=", new MybatisFlexConfgInfo(Arrays.asList("true", "false"), "开启 Mapper 自动生成")); + CONFIG_MAP.put("processor.mapper.annotation=", new MybatisFlexConfgInfo(Arrays.asList("true", "false"), "开启 @Mapper 注解")); + CONFIG_MAP.put("processor.mapper.baseClass=", new MybatisFlexConfgInfo(Arrays.asList(""), "自定义 Mapper 的父类")); + CONFIG_MAP.put("processor.mapper.package=", new MybatisFlexConfgInfo(Arrays.asList(""), "自定义 Mapper 生成的包名")); + CONFIG_MAP.put("processor.tableDef.propertiesNameStyle=", new MybatisFlexConfgInfo(Arrays.asList("upperCase", "lowerCase", "upperCamelCase", "lowerCamelCase"), "生成辅助类的字段风格")); + CONFIG_MAP.put("processor.tableDef.instanceSuffix=", new MybatisFlexConfgInfo(Arrays.asList(""), "生成的表对应的变量后缀")); + CONFIG_MAP.put("processor.tableDef.classSuffix=", new MybatisFlexConfgInfo(Arrays.asList(""), "生成的 TableDef 类的后缀")); + CONFIG_MAP.put("processor.tableDef.ignoreEntitySuffixes=", new MybatisFlexConfgInfo(Arrays.asList(""), "过滤 Entity 后缀")); + } + + + @Override + public void fillCompletionVariants(@NotNull CompletionParameters parameters, @NotNull CompletionResultSet result) { + Editor editor = parameters.getEditor(); + Document document = editor.getDocument(); + VirtualFile file = VirtualFileUtils.getVirtualFile(document); + boolean flag = file.getName().equals("mybatis-flex.config"); + // 如果不是 mybatis-flex.config 文件,直接返回 + if (!flag) { + return; + } + Project project = parameters.getPosition().getProject(); + if (ObjectUtil.isNull(elementFactory)) { + elementFactory = JavaPsiFacade.getElementFactory(project); + psiFacade = JavaPsiFacade.getInstance(project); + psiManager = PsiManager.getInstance(project); + } + + // 获取已经存在的配置,存在的配置不再提示 + List existConfigList = getExistConfig(document); + // 获取当前光标位置 + LogicalPosition logicalPosition = editor.getCaretModel().getLogicalPosition(); + // 获取当前光标位置的文本信息 + int line = logicalPosition.line; + String text = editor.getDocument().getText(new TextRange(line, document.getLineEndOffset(line))); + // 如果包含 = ,则提示 value + if (text.contains("=")) { + text = text.substring(0, text.lastIndexOf("=") + 1); + MybatisFlexConfgInfo confgInfo = CONFIG_MAP.get(text); + if (ObjectUtil.isNotNull(confgInfo)) { + addCodeTip(result, confgInfo.getValue()); + return; + } + } + // 添加代码提示 + addCodeTip(result, existConfigList, text); + } + + /** + * 获取已经存在的配置 + * + * @param document + * @return + */ + private List getExistConfig(Document document) { + List existConfigList = new ArrayList<>(); + String text = document.getText(); + for (String configKey : CONFIG_MAP.keySet()) { + if (text.contains(configKey)) { + existConfigList.add(configKey); + } + } + return existConfigList; + } + + /** + * 添加代码提示(值) + * + * @param result + * @param list + */ + private void addCodeTip(@NotNull CompletionResultSet result, List list) { + if (list.size() == 1) { + return; + } + for (String key : list) { + // 添加补全提示 + LookupElement lookupElement = LookupElementBuilder.create(key) + .withIcon(Icons.FLEX); + result.addElement(lookupElement); + } + + + } + + /** + * 添加代码提示 + * + * @param result 结果 + * @param existConfigList + * @param text + */ + private void addCodeTip(@NotNull CompletionResultSet result, List existConfigList, String text) { + // 获取忽略大小写的结果集 + CompletionResultSet completionResultSet = result.caseInsensitive(); + String prefix = completionResultSet.getPrefixMatcher().getPrefix(); + if (StrUtil.isEmpty(prefix)) { + return; + } + for (Map.Entry entry : CONFIG_MAP.entrySet()) { + String key = entry.getKey(); + if (existConfigList.contains(key)) { + continue; + } + MybatisFlexConfgInfo confgInfo = entry.getValue(); + confgInfo.getValue().forEach(el -> { + // 添加补全提示 + LookupElement lookupElement = LookupElementBuilder.create(key + el) + .withTypeText(confgInfo.getDescription()) + .withInsertHandler((context, item) -> { + int tailOffset = context.getTailOffset(); + // 如果不包含 #,则添加注释 + if (!text.contains("#")) { + context.getDocument().insertString(tailOffset, " # " + confgInfo.getDescription()); + } + if (confgInfo.getValue().size() > 1) { + context.getEditor().getCaretModel().moveToOffset(tailOffset + key.length() + 3); + } + }) + .withIcon(Icons.FLEX); + completionResultSet.addElement(lookupElement); + }); + + } + } +} diff --git a/src/main/java/club/bigtian/mf/plugin/core/icons/Icons.java b/src/main/java/club/bigtian/mf/plugin/core/icons/Icons.java index 83f26ad4cd6627aad42054f75800016947cc909f..af32d9d046729e137229b807036ba21d3b8e1db2 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/icons/Icons.java +++ b/src/main/java/club/bigtian/mf/plugin/core/icons/Icons.java @@ -13,6 +13,8 @@ import javax.swing.*; */ public class Icons { public static final Icon MY_BATIS = IconLoader.getIcon("/icons/ibatis.svg", Icons.class); + public static final Icon FLEX = IconLoader.getIcon("/icons/flex.svg", Icons.class); public static final Icon DONATE = IconLoader.getIcon("/icons/coffee.svg", Icons.class); public static final Icon PRETTY_PRINT = IconLoader.getIcon("/icons/prettyPrint.svg", Icons.class); + public static final Icon SQL_PREVIEW = IconLoader.getIcon("/icons/sqlPreview.svg", Icons.class); } \ No newline at end of file diff --git a/src/main/java/club/bigtian/mf/plugin/core/log/MyBatisLogExecutor.java b/src/main/java/club/bigtian/mf/plugin/core/log/MyBatisLogExecutor.java index 85c259b677f76968efbdb53d9b903070ab387617..9008c4b0e3b528a85dd0333a372a2de0afc2c812 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/log/MyBatisLogExecutor.java +++ b/src/main/java/club/bigtian/mf/plugin/core/log/MyBatisLogExecutor.java @@ -12,7 +12,7 @@ import javax.swing.*; * * @author huangxingguang */ -class MyBatisLogExecutor extends Executor { +public class MyBatisLogExecutor extends Executor { public static final String TOOL_WINDOW_ID = "MyBatis Log"; diff --git a/src/main/java/club/bigtian/mf/plugin/core/render/SqlPreviewIconRenderer.java b/src/main/java/club/bigtian/mf/plugin/core/render/SqlPreviewIconRenderer.java new file mode 100644 index 0000000000000000000000000000000000000000..995555e1eef763e03884c532b967a29a25391272 --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/core/render/SqlPreviewIconRenderer.java @@ -0,0 +1,70 @@ +package club.bigtian.mf.plugin.core.render; + +import club.bigtian.mf.plugin.action.flex.SQLPreviewAction; +import club.bigtian.mf.plugin.core.icons.Icons; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.editor.markup.GutterIconRenderer; +import com.intellij.psi.PsiJavaFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Map; + +public class SqlPreviewIconRenderer extends GutterIconRenderer { + private int lineNumber; + private PsiJavaFile psiFile; + private static boolean isEnabled = true; // 添加一个标志用于控制按钮的启用状态 + Map iconMap; + + public SqlPreviewIconRenderer(int lineNumber, PsiJavaFile psiFile, Map iconMap) { + this.lineNumber = lineNumber; + this.psiFile = psiFile; + this.iconMap = iconMap; + } + + @Override + public boolean equals(Object obj) { + return false; + } + + @Override + public @Nullable AnAction getClickAction() { + return new AnAction() { + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + if (isEnabled) { // 检查按钮是否启用 + isEnabled = false; // 点击后禁用按钮 + new SQLPreviewAction().preview(iconMap.get(lineNumber), psiFile, () -> { + // 在SQLPreviewAction完成所有逻辑后,再启用按钮 + isEnabled = true; + }); + + } + } + }; + + } + + @Override + public boolean isNavigateAction() { + return true; + } + + + @Override + public @Nullable String getTooltipText() { + return "预览 SQL"; + } + + @Override + public int hashCode() { + return 0; + } + + @Override + public @NotNull Icon getIcon() { + return Icons.SQL_PREVIEW; + } +} \ No newline at end of file diff --git a/src/main/java/club/bigtian/mf/plugin/core/type/MybatisFlexConfigFileType.java b/src/main/java/club/bigtian/mf/plugin/core/type/MybatisFlexConfigFileType.java new file mode 100644 index 0000000000000000000000000000000000000000..86789fee1095ec0eeaeff39ff68cb28e739ee697 --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/core/type/MybatisFlexConfigFileType.java @@ -0,0 +1,28 @@ +package club.bigtian.mf.plugin.core.type; + +import club.bigtian.mf.plugin.core.icons.Icons; +import com.intellij.ide.FileIconProvider; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +/** + * mybatis-flex.config 文件图标 + * + * @author bigtian + */ +public class MybatisFlexConfigFileType implements FileIconProvider { + + + @Override + public @Nullable Icon getIcon(@NotNull VirtualFile file, int flags, @Nullable Project project) { + if (file.getName().equals("mybatis-flex.config")) { + return Icons.FLEX; + } + // 返回 null 时,使用默认图标 + return null; + } +} diff --git a/src/main/java/club/bigtian/mf/plugin/core/util/CompilerManagerUtil.java b/src/main/java/club/bigtian/mf/plugin/core/util/CompilerManagerUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..03bef6c2098d53240dc7fd21ce6688ad9965d8ce --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/core/util/CompilerManagerUtil.java @@ -0,0 +1,47 @@ +package club.bigtian.mf.plugin.core.util; + +import com.intellij.openapi.compiler.CompileStatusNotification; +import com.intellij.openapi.compiler.CompilerManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.vfs.VirtualFile; + +public class CompilerManagerUtil { + private static final Logger LOG = Logger.getInstance(CompilerManagerUtil.class); + + /** + * 编译 + * + * @param files 文件 + * @param notification 通知 + */ + public static void compile(VirtualFile[] files, CompileStatusNotification notification) { + CompilerManager compilerManager = getCompilerManager(); + compilerManager.compile(files, notification); + LOG.info("编译完成"); + } + + /** + * 重新编译 + */ + public static void rebuild() { + CompilerManager compilerManager = getCompilerManager(); + compilerManager.rebuild(null); + LOG.info("编译完成"); + } + + private static CompilerManager getCompilerManager() { + CompilerManager compilerManager = CompilerManager.getInstance(ProjectUtils.getCurrentProject()); + return compilerManager; + } + + /** + * 单独编译某个模块 + * + * @param module 模块 + */ + public static void make(Module module) { + CompilerManager compilerManager = CompilerManager.getInstance(ProjectUtils.getCurrentProject()); + compilerManager.make(module, null); + } +} diff --git a/src/main/java/club/bigtian/mf/plugin/core/util/Modules.java b/src/main/java/club/bigtian/mf/plugin/core/util/Modules.java index 1d91e100806fe3ea9bd82154f5b6d88af7bfac06..5fec99f5be513d0cb2007771f8d565cb0cb54cec 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/util/Modules.java +++ b/src/main/java/club/bigtian/mf/plugin/core/util/Modules.java @@ -15,7 +15,10 @@ import com.intellij.openapi.roots.ModuleFileIndex; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.*; +import com.intellij.psi.JavaDirectoryService; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiManager; +import com.intellij.psi.PsiPackage; import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import javax.swing.*; @@ -46,11 +49,15 @@ public class Modules { Map moduleMap = modulePackageMap.get(moduleName); if (CollUtil.isEmpty(moduleMap)) { NotificationUtils.notifyError("模块不存在!", "", ProjectUtils.getCurrentProject()); - throw new RuntimeException("模块不存在"); + throw new RuntimeException(StrUtil.format("模块不存在:{}", moduleName)); } return moduleMap.getOrDefault(packageName, ""); } + public static Module[] getModule(Project project) { + return ModuleManager.getInstance(project).getModules(); + } + /** * 获取模块 * @@ -69,14 +76,21 @@ public class Modules { modulesCombox.setRenderer(new ModuleComBoxRender()); moduleMap = Arrays.stream(modules) - .filter(el -> { + .filter(module -> { if (isManvenProject) { - return true; + return ArrayUtil.isNotEmpty(ModuleRootManager.getInstance(module).getSourceRoots()); } // 非maven项目只显示main模块,只有main模块才有java目录 - return el.getName().contains(".main"); + return module.getName().contains(".main"); }) - .collect(Collectors.toMap(el -> el.getName().split("\\.")[0], module -> module)); + .collect(Collectors.toMap(el -> { + String name = el.getName(); + if(name.contains(".")){ + String[] strArr = name.split("\\."); + return strArr[strArr.length - 2]; + } + return name; + }, module -> module)); FilterComboBoxModel model = new FilterComboBoxModel(moduleMap.keySet().stream().collect(Collectors.toList())); modulesCombox.setModel(model); modulesCombox.setSelectedIndex(0); @@ -96,7 +110,7 @@ public class Modules { PsiDirectory psiDirectory = psiManager.findDirectory(fileOrDir); LOG.assertTrue(psiDirectory != null); PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(psiDirectory); - if (aPackage != null ) { + if (aPackage != null) { moduleMap.put(aPackage.getName(), aPackage.getQualifiedName()); } } @@ -104,7 +118,8 @@ public class Modules { }); String name = module.getName(); if (name.contains(".")) { - name = StrUtil.subBefore(name, ".", false); + String[] strArr =name.split("\\."); + name = strArr[strArr.length - 2]; } modulePackageMap.put(name, moduleMap); } diff --git a/src/main/java/club/bigtian/mf/plugin/core/util/NotificationUtils.java b/src/main/java/club/bigtian/mf/plugin/core/util/NotificationUtils.java index 22be2e31d92234ff0e4cdfab3bd32564e316fe13..565d737c82ec528742fe55fcd40dd5e41c2548ae 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/util/NotificationUtils.java +++ b/src/main/java/club/bigtian/mf/plugin/core/util/NotificationUtils.java @@ -1,10 +1,10 @@ package club.bigtian.mf.plugin.core.util; +import club.bigtian.mf.plugin.core.constant.MybatisFlexConstant; import com.intellij.notification.Notification; import com.intellij.notification.NotificationType; import com.intellij.notification.Notifications; import com.intellij.openapi.project.Project; -import club.bigtian.mf.plugin.core.constant.MybatisFlexConstant; /** * 通知工具类 @@ -29,12 +29,26 @@ public class NotificationUtils { Notifications.Bus.notify(notification, project); } + public static void notifySuccess(String content, String title) { + Notification notification = new Notification( + MybatisFlexConstant.NOTICE_GROUP_ID, + title, + content, + NotificationType.INFORMATION + ); + // 在屏幕右下角显示通知 + Notifications.Bus.notify(notification, ProjectUtils.getCurrentProject()); + } + /** * 通知成功 * * @param content 内容 - * @param project 项目 */ + public static void notifySuccess(String content) { + notifySuccess(content, "提示", ProjectUtils.getCurrentProject()); + } + public static void notifySuccess(String content, Project project) { notifySuccess(content, "提示", project); } @@ -75,5 +89,16 @@ public class NotificationUtils { Notifications.Bus.notify(notification, project); } + public static void notifyError(String content, String title) { + Notification notification = new Notification( + MybatisFlexConstant.NOTICE_GROUP_ID, + title, + content, + NotificationType.ERROR + ); + // 在屏幕右下角显示通知 + Notifications.Bus.notify(notification, ProjectUtils.getCurrentProject()); + } + } diff --git a/src/main/java/club/bigtian/mf/plugin/core/util/PsiJavaFileUtil.java b/src/main/java/club/bigtian/mf/plugin/core/util/PsiJavaFileUtil.java index efc7dfa0b71e3a1cf012aa96dcdead8ed7719205..a1b81a5ec669a63a812338581420f0af5cb54b03 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/util/PsiJavaFileUtil.java +++ b/src/main/java/club/bigtian/mf/plugin/core/util/PsiJavaFileUtil.java @@ -1,16 +1,24 @@ package club.bigtian.mf.plugin.core.util; +import cn.hutool.core.util.ObjectUtil; +import com.intellij.psi.PsiImportList; import com.intellij.psi.PsiImportStatementBase; import com.intellij.psi.PsiJavaFile; import java.util.Arrays; +import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; public class PsiJavaFileUtil { public static Set getImportSet(PsiJavaFile psiJavaFile) { - return Arrays.stream(Objects.requireNonNull(psiJavaFile.getImportList()).getAllImportStatements()) + PsiImportList importList = psiJavaFile.getImportList(); + if (ObjectUtil.isNull(importList)) { + return new HashSet<>(); + } + + return Arrays.stream(Objects.requireNonNull(importList).getAllImportStatements()) .map(PsiImportStatementBase::getText) .collect(Collectors.toSet()); } diff --git a/src/main/java/club/bigtian/mf/plugin/core/util/TableUtils.java b/src/main/java/club/bigtian/mf/plugin/core/util/TableUtils.java index 07c86646d92bae4142238816f6162e5c6f73e667..0de4e92f7ef535c852723d62dd26e025c1cd9e43 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/util/TableUtils.java +++ b/src/main/java/club/bigtian/mf/plugin/core/util/TableUtils.java @@ -3,6 +3,7 @@ package club.bigtian.mf.plugin.core.util; import club.bigtian.mf.plugin.core.persistent.MybatisFlexPluginConfigData; import club.bigtian.mf.plugin.entity.ColumnInfo; import club.bigtian.mf.plugin.entity.TableInfo; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.intellij.database.dialects.DatabaseDialectEx; @@ -39,6 +40,9 @@ public class TableUtils { public static List getSelectedTableName(AnActionEvent actionEvent) { DataKey databaseNodes = DataKey.create("DATABASE_NODES"); Object[] data = actionEvent.getData(databaseNodes); + if (ArrayUtil.isEmpty(data)) { + return new ArrayList<>(); + } return Arrays.stream(data).map(item -> { DasTable dasTable = (DasTable) item; return dasTable.getName(); diff --git a/src/main/java/club/bigtian/mf/plugin/core/util/VirtualFileUtils.java b/src/main/java/club/bigtian/mf/plugin/core/util/VirtualFileUtils.java index 0c827d68c453c89c35e9e0aa44b4b5d2136e545a..d407452faf4bd2eac6eee8ef5b0367eaae9660c3 100644 --- a/src/main/java/club/bigtian/mf/plugin/core/util/VirtualFileUtils.java +++ b/src/main/java/club/bigtian/mf/plugin/core/util/VirtualFileUtils.java @@ -8,6 +8,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; @@ -25,6 +26,11 @@ public class VirtualFileUtils { return psiManager.findFile(virtualFile); } + public static PsiFile getPsiFile(Document document) { + + return PsiDocumentManager.getInstance(ProjectUtils.getCurrentProject()).getPsiFile(document); + } + public static VirtualFile getVirtualFile(Document document) { return fileDocumentManager.getFile(document); diff --git a/src/main/java/club/bigtian/mf/plugin/entity/MybatisFlexConfgInfo.java b/src/main/java/club/bigtian/mf/plugin/entity/MybatisFlexConfgInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..20095cd7c7c701d11bde0055637e0106ad1ba6bf --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/entity/MybatisFlexConfgInfo.java @@ -0,0 +1,34 @@ +package club.bigtian.mf.plugin.entity; + +import java.util.List; + +public class MybatisFlexConfgInfo { + + private List value; + + private String description; + + + public MybatisFlexConfgInfo(List value, String description) { + this.value = value; + this.description = description; + } + + public List getValue() { + return value; + } + + public void setValue(List value) { + this.value = value; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + +} diff --git a/src/main/java/club/bigtian/mf/plugin/windows/MybatisFlexSettingDialog.form b/src/main/java/club/bigtian/mf/plugin/windows/MybatisFlexSettingDialog.form index 1fd37deef7ccff958897132fb0b49eddd4c7ebc2..fec4163c65631ba511beeae98afc02ec6dfedf62 100644 --- a/src/main/java/club/bigtian/mf/plugin/windows/MybatisFlexSettingDialog.form +++ b/src/main/java/club/bigtian/mf/plugin/windows/MybatisFlexSettingDialog.form @@ -2,7 +2,7 @@
- + @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -58,6 +58,12 @@ + + + + + + @@ -225,7 +231,7 @@ - + @@ -572,6 +578,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/club/bigtian/mf/plugin/windows/MybatisFlexSettingDialog.java b/src/main/java/club/bigtian/mf/plugin/windows/MybatisFlexSettingDialog.java index 3b4dfe47cfa4fd0ff85992c8550cd02e9c25de1c..c4cf17a8646b785c036df46f45eaec590bdd66ff 100644 --- a/src/main/java/club/bigtian/mf/plugin/windows/MybatisFlexSettingDialog.java +++ b/src/main/java/club/bigtian/mf/plugin/windows/MybatisFlexSettingDialog.java @@ -72,6 +72,8 @@ public class MybatisFlexSettingDialog extends JDialog { private JTextField domainPath; private JTextField xmlPath; private JTextField mapperPath; + private JCheckBox accessorsCheckBox; + private JTabbedPane tabbedPane2; private Project project; public MybatisFlexSettingDialog(Project project) { @@ -231,6 +233,7 @@ public class MybatisFlexSettingDialog extends JDialog { domainPath.setText(ObjectUtil.defaultIfBlank(Template.getConfigData(MybatisFlexConstant.DOMAIN_PATH), domainPath.getText())); xmlPath.setText(ObjectUtil.defaultIfBlank(Template.getConfigData(MybatisFlexConstant.XML_PATH), xmlPath.getText())); mapperPath.setText(ObjectUtil.defaultIfBlank(Template.getConfigData(MybatisFlexConstant.MAPPER_PATH), mapperPath.getText())); + accessorsCheckBox.setSelected(Template.getChecBoxConfig(MybatisFlexConstant.LOMBOK_ACCESSORS)); initSinceComBox(); } @@ -304,6 +307,7 @@ public class MybatisFlexSettingDialog extends JDialog { config.setDomainPath(domainPath.getText()); config.setXmlPath(xmlPath.getText()); config.setMapperPath(mapperPath.getText()); + config.setAccessors(accessorsCheckBox.isSelected()); return config; } diff --git a/src/main/java/club/bigtian/mf/plugin/windows/SQLPreviewDialog.form b/src/main/java/club/bigtian/mf/plugin/windows/SQLPreviewDialog.form new file mode 100644 index 0000000000000000000000000000000000000000..6a09370c1ffef147ef6fa8115e2cb952ae7e717a --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/windows/SQLPreviewDialog.form @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/club/bigtian/mf/plugin/windows/SQLPreviewDialog.java b/src/main/java/club/bigtian/mf/plugin/windows/SQLPreviewDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..f4a9ca129dedc229f61f7b1b2778c36677f37eeb --- /dev/null +++ b/src/main/java/club/bigtian/mf/plugin/windows/SQLPreviewDialog.java @@ -0,0 +1,81 @@ +package club.bigtian.mf.plugin.windows; + +import club.bigtian.mf.plugin.core.util.BasicFormatter; +import club.bigtian.mf.plugin.core.util.DialogUtil; +import club.bigtian.mf.plugin.core.util.NotificationUtils; +import club.bigtian.mf.plugin.core.util.ProjectUtils; +import cn.hutool.core.swing.clipboard.ClipboardUtil; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.vfs.VirtualFile; + +import javax.swing.*; +import java.awt.event.*; +import java.io.IOException; + +/** + * sql预览窗口 + */ +public class SQLPreviewDialog extends JDialog { + private JPanel contentPane; + private JButton buttonOK; + private JButton buttonCancel; + private JTextArea sqlPreview; + private static final BasicFormatter FORMATTER = new BasicFormatter(); + private String sql; + + public SQLPreviewDialog(String sql, VirtualFile virtualFile) { + setContentPane(contentPane); + setModal(true); + getRootPane().setDefaultButton(buttonOK); + setTitle("SQL Preview"); + setSize(500, 500); + DialogUtil.centerShow(this); + + buttonOK.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + onOK(); + } + }); + + buttonCancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + onCancel(); + } + }); + this.sql = FORMATTER.format(sql); + sqlPreview.setText(this.sql); + // call onCancel() when cross is clicked + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + onCancel(); + } + }); + + // call onCancel() on ESCAPE + contentPane.registerKeyboardAction(new ActionListener() { + public void actionPerformed(ActionEvent e) { + onCancel(); + } + }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); +// psiFile.delete(); + WriteCommandAction.runWriteCommandAction(ProjectUtils.getCurrentProject(), () -> { + try { + virtualFile.delete(this); + } catch (IOException e) { + System.out.println(e.getMessage()); + } + }); + } + + private void onOK() { + ClipboardUtil.setStr(sql); + NotificationUtils.notifySuccess("🎉SQL copied to clipboard.🎉"); + dispose(); + } + + private void onCancel() { + // add your code here if necessary + dispose(); + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 13d2354f4caf45aef326ea16d7c4b82a949e5131..e9d2e3226d80812aa5ae4b9e332029e6cfbd90a7 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -4,7 +4,7 @@ com.mybatisflex.bigtian - MybatisFlex-helpler + Mybatis-Flex-Helper 时间淡忘一切 @@ -13,34 +13,36 @@ Simple HTML elements (text formatting, paragraphs, and lists) can be added inside of tag. Guidelines: https://plugins.jetbrains.com/docs/marketplace/plugin-overview-page.html#plugin-description --> -

MybatisFlex-Helper plugin Features:

+ MyBatis-Flex 官网 +

Features:

    -
  • 1、The resulting APT file supports hints
  • -
  • 2、Code templates are highly customizable
  • -
  • 3、APT automatic compilation
  • -
  • 4、Share template-related configurations
  • +
  • The resulting APT file supports hints
  • +
  • Code templates are highly customizable
  • +
  • APT automatic compilation
  • +
  • Share template-related configurations
  • +
  • Automatically identify the packet path
    -
  • 1、APT文件支持代码提示
  • -
  • 2、代码模版高度自定义
  • -
  • 3、APT自动编译
  • -
  • 4、模板相关配置分享
  • +
  • APT文件支持代码提示
  • +
  • 代码模版高度自定义
  • +
  • APT自动编译
  • +
  • 模板相关配置分享
  • +
  • 自动识别包路径
]]>
1.4.3-RELEASE +

1.4.4-RELEASE

    -
  • 【新增】支持 APT 提示(java/Kotlin)
  • -
  • 【新增】路径自动匹配(需要在设置里面配置,会匹配以配置结束的包名,java和resources下面不能有一样的、否则会覆盖)
  • -
  • 【新增】增加逻辑删除配置
  • -
  • 【优化】支持 IDEA2020.2往上版本
  • -
  • 【优化】提供严格模式切换,支持生成单个文件
  • -
  • 【优化】清理部分过时 API
  • -
  • 【优化】优化 APT 编译
  • -
  • 【修复】修复项目没有 TableDef 会导致IDEA 自身提示没有
  • +
  • 【新增】mybatis-flex.config 配置提示
  • +
  • 【新增】自动生成 APT 文件(解决 mvn clean 之后无法编译)
  • +
  • 【新增】Lombok链式调用注解@Accessors
  • +
  • 【新增】SQL 预览(QueryWrapper)
  • +
  • 【优化】生成代码后自动生成 APT 文件
  • +
  • 【优化】mybatis-flex.config icon 调整
  • +
  • 【优化】多模块开发过滤掉没有用的父级项目
  • +
  • 【优化】生成代码之后自动编译
]]>
+ + + + + + + + + + + + diff --git a/src/main/resources/icons/flex.svg b/src/main/resources/icons/flex.svg new file mode 100644 index 0000000000000000000000000000000000000000..dbdd5e3aeeedd077a4eb55e94c6b2d3cda53bda0 --- /dev/null +++ b/src/main/resources/icons/flex.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/icons/sqlPreview.svg b/src/main/resources/icons/sqlPreview.svg new file mode 100644 index 0000000000000000000000000000000000000000..ecea81cf5aac613668a6d3d3641ead5a324bdb1d --- /dev/null +++ b/src/main/resources/icons/sqlPreview.svg @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/modelTemplate.java.vm b/src/main/resources/templates/modelTemplate.java.vm index 9b54d7141739abf7382219134691590393cb9713..f8683106d14c97798f022fd2b6c8f12814a58e32 100644 --- a/src/main/resources/templates/modelTemplate.java.vm +++ b/src/main/resources/templates/modelTemplate.java.vm @@ -12,6 +12,9 @@ import lombok.NoArgsConstructor; #if($config.builder) import lombok.Builder; #end +#if($config.accessors) +import lombok.experimental.Accessors; +#end #if($config.swagger) import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -33,6 +36,9 @@ import $classImport; * @author $author * @since $since */ +#if($config.accessors) +@Accessors(chain = true) +#end #if($config.data) @Data #end