如何在 Intellij IDEA Plugin DevKit 中为文件模板创建子菜单?
How to create Sub-Menu for File Templates in Intellij IDEA Plugin DevKit?
背景
我正在开发一个插件,用户可以在其中从现有文件模板创建新文件。目标是将多个文件模板合并到主文件菜单下的新子菜单中。如果可能的话,我想创建一个基于模板类别的嵌套子菜单。例如:
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
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
文件中注册了action
和internalFileTemplate
<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>
预期
我将非常感谢任何建议或代码片段。如果要求不可行,我也可以使用替代解决方案,例如弹出对话框。
更新
修改 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
但是:
默认输入对话框单独使用自定义变量。例如。它首先接受 class name $NAME
变量的输入,然后接受其他变量
我一直在寻找一种方法来在单个对话框中获取所有自定义变量的输入。这是在不使用插件的情况下使用常规文件模板时的输入对话框示例。
您可以将自己的组注册到plugin.xml
文件中的NewGroup,并向其中添加您的操作。例如:
<group id="MyNewGroup" popup="true" class="com.intellij.ide.actions.NonTrivialActionGroup">
<add-to-group group-id="NewGroup"/>
</group>
背景
我正在开发一个插件,用户可以在其中从现有文件模板创建新文件。目标是将多个文件模板合并到主文件菜单下的新子菜单中。如果可能的话,我想创建一个基于模板类别的嵌套子菜单。例如:
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
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
文件中注册了action
和internalFileTemplate
<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>
预期
我将非常感谢任何建议或代码片段。如果要求不可行,我也可以使用替代解决方案,例如弹出对话框。
更新
修改 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
但是:
默认输入对话框单独使用自定义变量。例如。它首先接受 class name $NAME
变量的输入,然后接受其他变量
我一直在寻找一种方法来在单个对话框中获取所有自定义变量的输入。这是在不使用插件的情况下使用常规文件模板时的输入对话框示例。
您可以将自己的组注册到plugin.xml
文件中的NewGroup,并向其中添加您的操作。例如:
<group id="MyNewGroup" popup="true" class="com.intellij.ide.actions.NonTrivialActionGroup">
<add-to-group group-id="NewGroup"/>
</group>