diff --git a/src/main/kotlin/de/idetools/filename_template/CreateFileWithFilenameTemplateAction.kt b/src/main/kotlin/de/idetools/filename_template/CreateFileWithFilenameTemplateAction.kt index ffd4063..7d65193 100644 --- a/src/main/kotlin/de/idetools/filename_template/CreateFileWithFilenameTemplateAction.kt +++ b/src/main/kotlin/de/idetools/filename_template/CreateFileWithFilenameTemplateAction.kt @@ -4,38 +4,46 @@ import com.intellij.icons.AllIcons import com.intellij.ide.IdeBundle import com.intellij.ide.actions.CreateFileAction import com.intellij.ide.ui.newItemPopup.NewItemPopupUtil -import com.intellij.ide.ui.newItemPopup.NewItemSimplePopupPanel import com.intellij.lang.LangBundle import com.intellij.openapi.project.Project import com.intellij.openapi.ui.InputValidatorEx +import com.intellij.openapi.util.Trinity import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiElement -import de.idetools.filename_template.placeholders.PlaceholderProcessor +import de.idetools.filename_template.placeholders.* +import de.idetools.filename_template.settings.FilenameTemplateSettingsState import java.awt.event.InputEvent import java.util.function.Consumer +import kotlin.math.max -class CreateFileWithFilenameTemplateAction( - text: String, - description: String, - private val placeholderProcessor: PlaceholderProcessor -) : - CreateFileAction(text, description, AllIcons.FileTypes.Unknown) { +class CreateFileWithFilenameTemplateAction : + CreateFileAction("Filename Template", "Create a new file based on template", AllIcons.Actions.AddFile) { + + private val placeholders: List = listOf( + EpochPlaceholder(), + DatePlaceholder(), + ProjectPlaceholder(), + SequencePlaceholder(), + HostPlaceholder(), + UserPlaceholder(), + DefaultPlaceholder() + ) override fun invokeDialog( project: Project, directory: PsiDirectory, elementsConsumer: Consumer?> ) { + val templates = FilenameTemplateSettingsState.instance.filenameTemplates + .filter { it.isActive } + .map { + Trinity(it.name, AllIcons.Actions.AddFile, processTemplate(it.template, project, directory)) + } val validator: MyInputValidator = MyValidator(project, directory) - val contentPanel = NewItemSimplePopupPanel() + val contentPanel = CreateWithFilenameTemplateDialogPanel(templates) val nameField = contentPanel.textField - - val (filename, caretPosition) = placeholderProcessor.processTemplate(project, directory) - - nameField.text = filename - nameField.caretPosition = caretPosition - val popup = NewItemPopupUtil.createNewItemPopup(IdeBundle.message("title.new.file"), contentPanel, nameField) + contentPanel.setApplyAction { event: InputEvent? -> val name = nameField.text if (validator.checkInput(name) && validator.canClose(name)) { @@ -52,4 +60,46 @@ class CreateFileWithFilenameTemplateAction( } popup.showCenteredInCurrentWindow(project) } + + private fun processTemplate(template: String, project: Project, directory: PsiDirectory): String { + var placeholderLevel = 0 + var placeholder = "" + + val context = PlaceholderContext(project, directory) + + for (character in template) { + when (character) { + '{' -> { + if (0 < placeholderLevel) { + placeholder += character + } + + placeholderLevel += 1 + } + '}' -> { + if (placeholderLevel == 1) { + context.filename += placeholders + .first { it.supports(placeholder) } + .process(placeholder, context) + placeholder = "" + } + + placeholderLevel = max(0, placeholderLevel - 1) + + if (0 < placeholderLevel) { + placeholder += character + } + } + else -> { + if (0 < placeholderLevel) { + placeholder += character + } else { + context.filename += character + } + } + } + } + + return context.filename + } } diff --git a/src/main/kotlin/de/idetools/filename_template/CreateWithFilenameTemplateDialogPanel.kt b/src/main/kotlin/de/idetools/filename_template/CreateWithFilenameTemplateDialogPanel.kt new file mode 100644 index 0000000..39ef2f1 --- /dev/null +++ b/src/main/kotlin/de/idetools/filename_template/CreateWithFilenameTemplateDialogPanel.kt @@ -0,0 +1,32 @@ +package de.idetools.filename_template + +import com.intellij.ide.actions.newclass.CreateWithTemplatesDialogPanel +import com.intellij.openapi.util.Trinity +import javax.swing.Icon + +class CreateWithFilenameTemplateDialogPanel(templates: List>) : + CreateWithTemplatesDialogPanel(templates, templates.first().first) { + + init { + updateSelectedText() + myTemplatesList.addListSelectionListener { updateSelectedText() } + } + + private fun updateSelectedText() { + val selectedValue = myTemplatesList.selectedValue + if (selectedValue != null) { + var filename = selectedValue.third + val caretPosition = determineCaretPosition(filename) + filename = filename.replace("{|}", "") + + myTextField.text = filename + nameField.caretPosition = caretPosition + } + } + + private fun determineCaretPosition(filename: String): Int = when { + filename.indexOf("{|}") != -1 -> filename.indexOf("{|}") + filename.indexOfFirst { it == '.' } != -1 -> filename.indexOfFirst { it == '.' } + else -> filename.length + } +} diff --git a/src/main/kotlin/de/idetools/filename_template/InitializeFilenameTemplateActivity.kt b/src/main/kotlin/de/idetools/filename_template/InitializeFilenameTemplateActivity.kt deleted file mode 100644 index 11038cc..0000000 --- a/src/main/kotlin/de/idetools/filename_template/InitializeFilenameTemplateActivity.kt +++ /dev/null @@ -1,59 +0,0 @@ -package de.idetools.filename_template - -import com.intellij.openapi.actionSystem.ActionManager -import com.intellij.openapi.actionSystem.Anchor -import com.intellij.openapi.actionSystem.Constraints -import com.intellij.openapi.actionSystem.DefaultActionGroup -import com.intellij.openapi.project.Project -import com.intellij.openapi.startup.StartupActivity -import de.idetools.filename_template.placeholders.DatePlaceholder -import de.idetools.filename_template.placeholders.DefaultPlaceholder -import de.idetools.filename_template.placeholders.EpochPlaceholder -import de.idetools.filename_template.placeholders.HostPlaceholder -import de.idetools.filename_template.placeholders.Placeholder -import de.idetools.filename_template.placeholders.PlaceholderProcessor -import de.idetools.filename_template.placeholders.ProjectPlaceholder -import de.idetools.filename_template.placeholders.SequencePlaceholder -import de.idetools.filename_template.placeholders.UserPlaceholder -import de.idetools.filename_template.settings.FilenameTemplateSettingsState - -class InitializeFilenameTemplateActivity : StartupActivity { - private val placeholders: List = listOf( - EpochPlaceholder(), - DatePlaceholder(), - ProjectPlaceholder(), - SequencePlaceholder(), - HostPlaceholder(), - UserPlaceholder(), - DefaultPlaceholder() - ) - - override fun runActivity(project: Project) { - initializeActions() - } - - internal fun initializeActions() { - val settings: FilenameTemplateSettingsState = FilenameTemplateSettingsState.instance - - val actionManager = ActionManager.getInstance() - val newGroup = actionManager.getAction("NewGroup") as DefaultActionGroup - - actionManager.getActionIdList("FilenameTemplate").forEach { - newGroup.remove(actionManager.getAction(it)) - actionManager.unregisterAction(it) - } - - var anchorId = "NewFile" - settings.filenameTemplates.filter { it.isActive }.forEach { - val action = CreateFileWithFilenameTemplateAction( - it.name, - it.description, - PlaceholderProcessor(it.template, placeholders) - ) - val actionId = "FilenameTemplate.${it.name}" - actionManager.registerAction(actionId, action) - newGroup.addAction(action, Constraints(Anchor.AFTER, anchorId)) - anchorId = actionId - } - } -} diff --git a/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderProcessor.kt b/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderProcessor.kt deleted file mode 100644 index 1768331..0000000 --- a/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderProcessor.kt +++ /dev/null @@ -1,57 +0,0 @@ -package de.idetools.filename_template.placeholders - -import com.intellij.openapi.project.Project -import com.intellij.psi.PsiDirectory -import kotlin.math.max - -class PlaceholderProcessor(private val template: String, private val placeholders: List) { - - fun processTemplate(project: Project, directory: PsiDirectory): ProcessedTemplate { - var placeholderLevel = 0 - var placeholder = "" - - val context = PlaceholderContext(project, directory) - - for (character in template) { - when (character) { - '{' -> { - if (0 < placeholderLevel) { - placeholder += character - } - - placeholderLevel += 1 - } - '}' -> { - if (placeholderLevel == 1) { - context.filename += placeholders - .first { it.supports(placeholder) } - .process(placeholder, context) - placeholder = "" - } - - placeholderLevel = max(0, placeholderLevel - 1) - - if (0 < placeholderLevel) { - placeholder += character - } - } - else -> { - if (0 < placeholderLevel) { - placeholder += character - } else { - context.filename += character - } - } - } - } - - val caretPosition = when { - context.filename.indexOf("{|}") != -1 -> context.filename.indexOf("{|}") - context.filename.indexOfFirst { it == '.' } != -1 -> context.filename.indexOfFirst { it == '.' } - else -> context.filename.length - } - context.filename = context.filename.replace("{|}", "") - - return ProcessedTemplate(context.filename, caretPosition) - } -} diff --git a/src/main/kotlin/de/idetools/filename_template/settings/FilenameTemplateConfigurable.kt b/src/main/kotlin/de/idetools/filename_template/settings/FilenameTemplateConfigurable.kt index 9c62ae4..fd792b3 100644 --- a/src/main/kotlin/de/idetools/filename_template/settings/FilenameTemplateConfigurable.kt +++ b/src/main/kotlin/de/idetools/filename_template/settings/FilenameTemplateConfigurable.kt @@ -2,7 +2,6 @@ package de.idetools.filename_template.settings import com.intellij.openapi.options.Configurable import com.intellij.openapi.options.ConfigurationException -import de.idetools.filename_template.InitializeFilenameTemplateActivity import org.jetbrains.annotations.Nls import javax.swing.JComponent @@ -50,7 +49,6 @@ class FilenameTemplateConfigurable : Configurable { it.template ) }) - InitializeFilenameTemplateActivity().initializeActions() } override fun reset() { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 5e0e4b0..a4eba9c 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -92,11 +92,13 @@ instance="de.idetools.filename_template.settings.FilenameTemplateConfigurable" id="de.idetools.filename_template.settings.FilenameTemplateConfigurable" displayName="Filename Template"/> - - + + + diff --git a/src/main/resources/META-INF/pluginIcon-small.png b/src/main/resources/META-INF/pluginIcon-small.png new file mode 100644 index 0000000..56bac84 Binary files /dev/null and b/src/main/resources/META-INF/pluginIcon-small.png differ diff --git a/src/main/resources/META-INF/pluginIcon-small_dark.png b/src/main/resources/META-INF/pluginIcon-small_dark.png new file mode 100644 index 0000000..55421ca Binary files /dev/null and b/src/main/resources/META-INF/pluginIcon-small_dark.png differ