【问题标题】:How to create Sub-Menu for File Templates in Intellij IDEA Plugin DevKit?如何在 Intellij IDEA Plugin DevKit 中为文件模板创建子菜单?
【发布时间】:2021-09-02 14:44:44
【问题描述】:

背景

我正在开发一个插件,用户可以在其中从现有文件模板创建新文件。目标是将多个文件模板合并到主文件菜单下的新子菜单中。如果可能的话,我想创建一个基于模板类别的嵌套子菜单。例如:

New -> New Option -> Option A ->
                                  Sub-Option A
                                  Sub-Option B
                                  Sub-Option C
                     Option B ->
                     Option C ->

当前进度

到目前为止,我可以在文件菜单下成功添加文件模板。但是,所有这些都未分组并直接放置在文件菜单中。随着模板数量的不断增加,管理变得越来越困难。

New -> Option A 
       Option B 
       Option C

为了创建文件模板,我使用了CreateFileFromTemplateAction

class NewFile : CreateFileFromTemplateAction(TEXT, TEST_DESCRIPTION, ICON) {

    companion object {
        fun createProperties(project: Project, className: String): Properties {
            val properties = FileTemplateManager.getInstance(project).defaultProperties
            properties += "VERSION" to "1.0.0"
            properties += "NAME" to className
            return properties
        }
    }

    override fun buildDialog(project: Project, directory: PsiDirectory, builder: CreateFileFromTemplateDialog.Builder) {
        builder.addKind("Option A", null, "Option A.kt.ft")
        builder.addKind("Option B", null, "Option B.kt.ft")
        builder.addKind("Option C", null, "Option C.kt.ft")
    }

    override fun getActionName(project: PsiDirectory?, directory: String, builder: String?): String {
        return NEW_FILE_ACTION
    }

    override fun createFileFromTemplate(name: String, template: FileTemplate, dir: PsiDirectory) = try {
        val className = FileUtilRt.getNameWithoutExtension(name)
        val project = dir.project
        val properties = createProperties(project, className)
        CreateFromTemplateDialog(project, dir, template, AttributesDefaults(className).withFixedName(true), properties)
            .create()
            .containingFile
    } catch (e: Exception) {
        LOG.error("Error while creating new file", e)
        null
    }

}

后来在plugin.xml文件中注册了actioninternalFileTemplate

<idea-plugin>

    <extensions defaultExtensionNs="com.intellij">
        <internalFileTemplate name="Option A"/>
        <internalFileTemplate name="Option B"/>
        <internalFileTemplate name="Option C"/>
    </extensions>

    <actions>
        <action
                id="NewFileAction"
                class="NewFile">
            <add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewFile"/>
        </action>
    </actions>

</idea-plugin>

期望

我将非常感谢任何建议或代码 sn-p。如果要求不可行,我还可以使用替代解决方案,例如弹出对话框。

更新

修改plugin.xml代码后,菜单+子菜单正确显示。

<actions>
        <group id="MyGroup.FileMenu"
               popup="true"
               class="com.intellij.ide.actions.NonTrivialActionGroup"
               text="New Option"
               description="New Option Description">
            <add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewFile"/>
            <separator/>
            <action id="NewFileAction"
                    class="NewFile"
                    text="My Action"
                    description="My Action Description"/>
        </group>
    </actions>

文件菜单的显示方式如下:

New -> New Option -> Option A
                     Option B
                     Option C

但是:

默认输入对话框分别采用自定义变量。例如。它先输入类名$NAME 变量,然后再输入其他变量

我一直在寻找一种方法来获取单个对话框中所有自定义变量的输入。这是使用常规文件模板而不使用插件时的输入对话框示例。

【问题讨论】:

  • RE 2:您似乎在操作中覆盖了createFileFromTemplate(),但不创建任何文件。似乎没有必要重写此方法。
  • @BasLeijdekkers 谢谢。现在,我在使用文件模板中的自定义变量时遇到了困难。请查看更新后的答案。
  • 如果您想要用户定义文件模板的对话框,请查看com.intellij.ide.fileTemplates.actions.CreateFromTemplateAction
  • 这能回答你的问题吗? How to create sub menuitem in intellij plugin

标签: intellij-idea jetbrains-ide intellij-plugin


【解决方案1】:

您可以在plugin.xml 文件中将您自己的组注册到NewGroup 并添加您的操作。例如:

<group id="MyNewGroup" popup="true" class="com.intellij.ide.actions.NonTrivialActionGroup">
  <add-to-group group-id="NewGroup"/>
</group>

【讨论】:

  • 谢谢。我已经进行了建议的更改。你能检查一下更新的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 2014-11-05
  • 1970-01-01
  • 2020-08-28
  • 2015-12-01
  • 2014-07-21
相关资源
最近更新 更多