小鸭子的学习笔记duck

Duck Blog

唐如飞

( ^∀^)/欢迎\( ^∀^)

79 文章数
14 评论数

IDEA插件开发API汇总

tangrufei
2023-06-02 / 0 评论 / 130 阅读 / 0 点赞

格式化代码

格式化代码

   public static void reformatJavaFile(PsiElement theElement) {
        CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(theElement.getProject());
        try {
            codeStyleManager.reformat(theElement);
        } catch (Exception e) {
            LOGGER.error("reformat code failed", e);
        }
    }

通知


NotificationGroup notificationGroup = NotificationGroupManager.getInstance().getNotificationGroup("notificationGroup");

这里,"notificationGroup" 是你的通知组的 ID。确保在你的插件中使用唯一的 ID,以避免与其他插件冲突。

请注意,随着 IntelliJ 平台的发展,API 可能会发生变化。始终建议查看最新的官方文档或 IntelliJ Platform SDK DevGuide 来获取最新的信息和最佳实践。
notificationGroup还必须在plugin.xml中申明

例如:
   <extensions defaultExtensionNs="com.intellij">
        <notificationGroup id="notificationGroup"
                           displayType="BALLOON"
                           toolWindowId=""
                           isLogByDefault="true"
                           icon="/icons/pluginIcon.svg"
        />

使用粘贴板

使用粘贴板

  CopyPasteManager.getInstance()
            .setContents(new SimpleTransferable(table.toString(), DataFlavor.allHtmlFlavor));

获取当前类文件的所有类对象

一个类文件中可能会有内部类,所以读取的时候返回的是一个列表

 public static List<PsiClass> getClasses(PsiElement element) {
        List<PsiClass> elements = Lists.newArrayList();
        List<PsiClass> classElements = PsiTreeUtil.getChildrenOfTypeAsList(element, PsiClass.class);
        elements.addAll(classElements);
        for (PsiClass classElement : classElements) {
            //这里用了递归的方式获取内部类
            elements.addAll(getClasses(classElement));
        }
        return elements;
    }

判断当前光标选择元素

  //获取当前事件触发时,光标所在的元素
        PsiElement psiElement = anActionEvent.getData(LangDataKeys.PSI_ELEMENT);
        //如果光标选择的不是类,弹出对话框提醒
        if (psiElement == null || !(psiElement instanceof PsiClass)) {
            Messages.showMessageDialog(project, "Please focus on a class", "Generate Failed", null);
            return;
        }

注册插件生命周期事件

对插件的全生命周期进行控制

public class HywayApplication implements ProjectComponent {
		 @Override
    public void disposeComponent() {
        System.out.println("组件销毁~~~~~");

        ProjectComponent.super.disposeComponent();
    }
	   @Override
    public void projectOpened() {
        System.out.println("项目打开阶段");
        ProjectComponent.super.projectOpened();
    }
	 @Override
    public void initComponent() {
      }
	  // 其他方法和组件生命周期方法(如disposeComponent)省略
}

还需要在resource->META-INFO->plugin文件中进行配置

  <application-components>
        <component>
            <implementation-class>com.atelier.plugin.projectWizard.HywayApplication</implementation-class>
        </component>
    </application-components>

窗口组件定义

public class MyToolWindowFactory implements ToolWindowFactory {
    private Template file=new Template("test","");
    /**
     * 编辑器组件
     */
    private Editor editor;
    @Override
    public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
        ContentFactory instance = ContentFactory.SERVICE.getInstance();
		这里加入自己的组件进入面板
		Content fuck = instance.createContent(mainPanel, "Atelier", false);
        toolWindow.getContentManager().addContent(fuck);
		}
}

获取文件编辑器指定文件

 VirtualFile newFile = LocalFileSystem.getInstance().findFileByIoFile(new File("文件路径"));
        FileEditor[] fileEditors = FileEditorManagerEx.getInstance(project).openFile(newFile, true);
        JComponent component = fileEditors[0].getComponent();

获取文件树

   FileSystemTree fileSystemTree = FileSystemTreeFactory.SERVICE.getInstance()
                .createFileSystemTree
                        (project,
                                new FileChooserDescriptor
                                        (true,
                                                true, true, true, true, true));
         JTree tree = fileSystemTree.getTree();

本地文件转成VirtualFile对象

VirtualFile newFile = LocalFileSystem.getInstance().findFileByIoFile(nodeFile);

根据文件名查找 PsiFiles

com.intellij.psi.search.FilenameIndex.getFilesByName

常用 API

  • com.intellij.psi.PsiFileFactory:
  • 文件相关操作,e.g.创建文件等。
  • com.intellij.psi.PsiElementFactory:
  • 元素相关操作,e.g.创建java方法、注解、字段、构造方法等。
  • com.intellij.psi.PsiManager:
  • 项目访问PSI服务的主要入口点,e.g.查找文件、查找文件夹等。
  • com.intellij.psi.PsiClass:
  • 在java类查找元素,e.g.查找方法、字段、注解。
  • com.intellij.psi.JavaPsiFacade:
  • java元素查找等操作,e.g.查找类等。

写操作

⚠️ 特别注意,对PsiElement的写操作需要在 writeAction 上下文中

WriteCommandAction.runWriteCommandAction

Virtual Files

虚拟文件VirtualFile(VF)是在IntelliJ的虚拟文件系统(VFS)中的文件表示。虚拟文件即本地文件系统中的文件。

不过,虚拟文件也可以表示JAR文件中的文件:

Library library = LibraryUtil.findLibraryByClass(psiClass.getQualifiedName(), project);
VirtualFile YmlFile = library.getFiles(OrderRootType.CLASSES)[0].findChild(TModuleExplorer.T_YAML);

PsiFIle 和 VF 互转

PsiFile psiFile = PsiManager.getInstance(serverModule.getProject()).findFile(virtualFile);

VirtualFile virtualFile = psiFile.getVirtualFile();

Action

定义
com.intellij.openapi.actionSystem.AnAction是所有Action的基类。

  • 必须覆盖AnAction.update(@NotNull AnActionEvent e)
    ⚠️它先于actionPerformed()被调用,用来更新动作状态(启用,可见),以确定该动作在IDE的UI中是否可见。AnActionEvent 类型的对象将传递给此方法,并包含有关该操作的当前上下文的信息。

ActionGroup

⚠️DefaultActionGroup 和 ActionGroup 都是 IntelliJ IDEA 中用于组织菜单的类,但它们之间有一些重要区别:

ActionGroup 是一个抽象类,表示一个菜单组。您可以扩展 ActionGroup 来创建自定义的菜单组,并添加子操作(包括其他组)。

DefaultActionGroup 是 ActionGroup 的一个具体实现,通常用于创建具有默认行为的组。DefaultActionGroup 通常用于创建基本的菜单项或工具栏按钮,而不是用于创建嵌套组。

如果您想要创建嵌套组的菜单,最好使用 ActionGroup。在上一条示例代码中,我将 ActionGroup 用于创建组织菜单的不同层级。

总之,如果您希望创建一个包含子组的嵌套菜单结构,使用 ActionGroup 是更好的选择,而不是 DefaultActionGroup。确保使用正确的类来创建您的菜单组结构,以获得所需的外观和行为。

⚠️注册配置xml文件的顺序需要遵循否则会使用 reference标签报错

创建

根据上述Action定义手动创建。利用Plugin DevKit;

文章不错,扫码支持一下吧~
上一篇 下一篇
评论
来首音乐
光阴似箭
今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月