From b1ca3b2b6c3fcbb0b23e3414731c0f749582154f Mon Sep 17 00:00:00 2001 From: spawlak Date: Thu, 11 Apr 2024 16:48:00 +0200 Subject: [PATCH 1/3] Adding support for creating sbt files #SCL-21374 --- .../resources/META-INF/scala-plugin-common.xml | 4 ++++ .../fileTemplates/internal/Sbt File.sbt.ft | 0 .../fileTemplates/internal/Sbt File.sbt.html | 14 ++++++++++++++ .../resources/messages/ScalaBundle.properties | 3 +++ .../scala/actions/NewSbtFileAction.scala | 18 ++++++++++++++++++ 5 files changed, 39 insertions(+) create mode 100644 scala/scala-impl/resources/fileTemplates/internal/Sbt File.sbt.ft create mode 100644 scala/scala-impl/resources/fileTemplates/internal/Sbt File.sbt.html create mode 100644 scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtFileAction.scala diff --git a/scala/scala-impl/resources/META-INF/scala-plugin-common.xml b/scala/scala-impl/resources/META-INF/scala-plugin-common.xml index a771e85916d..aec23f45797 100644 --- a/scala/scala-impl/resources/META-INF/scala-plugin-common.xml +++ b/scala/scala-impl/resources/META-INF/scala-plugin-common.xml @@ -311,6 +311,7 @@ + @@ -1982,6 +1983,9 @@ class="org.jetbrains.plugins.scala.components.TypeAwareWidgetFactory$Listener"/> + + + diff --git a/scala/scala-impl/resources/fileTemplates/internal/Sbt File.sbt.ft b/scala/scala-impl/resources/fileTemplates/internal/Sbt File.sbt.ft new file mode 100644 index 00000000000..e69de29bb2d diff --git a/scala/scala-impl/resources/fileTemplates/internal/Sbt File.sbt.html b/scala/scala-impl/resources/fileTemplates/internal/Sbt File.sbt.html new file mode 100644 index 00000000000..8abada1f17e --- /dev/null +++ b/scala/scala-impl/resources/fileTemplates/internal/Sbt File.sbt.html @@ -0,0 +1,14 @@ + + + + + + +
+ + This is a built-in template used by IntelliJ IDEA each time you create a + Sbt File + +
+ + diff --git a/scala/scala-impl/resources/messages/ScalaBundle.properties b/scala/scala-impl/resources/messages/ScalaBundle.properties index 06ca1194fea..224a7e1a428 100644 --- a/scala/scala-impl/resources/messages/ScalaBundle.properties +++ b/scala/scala-impl/resources/messages/ScalaBundle.properties @@ -40,6 +40,9 @@ newclassorfile.menu.action.description=Creates new Scala Class or File create.new.scala.class.or.file=Create New Scala Class/File this.is.not.a.valid.scala.qualified.name=This is not a valid Scala qualified name +newclassorfile.menu.action.sbt.text=Sbt File +newclassorfile.menu.action.sbt.description=Create new Sbt File + ### org/jetbrains/plugins/scala/actions/ShowTypeInfoAction.scala type.info.text=Type Info type.info.description=Show Type Info diff --git a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtFileAction.scala b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtFileAction.scala new file mode 100644 index 00000000000..37b3cb20f85 --- /dev/null +++ b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtFileAction.scala @@ -0,0 +1,18 @@ +package org.jetbrains.plugins.scala.actions + +import com.intellij.ide.fileTemplates.actions.CreateFromTemplateActionBase +import com.intellij.ide.fileTemplates.{FileTemplate, FileTemplateManager} +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiDirectory +import org.jetbrains.sbt.icons.Icons +import org.jetbrains.plugins.scala.ScalaBundle + +final class NewSbtFileAction extends CreateFromTemplateActionBase( + ScalaBundle.message("newclassorfile.menu.action.sbt.text"), + ScalaBundle.message("newclassorfile.menu.action.sbt.description"), + Icons.SBT_FILE +) { + + override def getTemplate(project: Project, dir: PsiDirectory): FileTemplate = FileTemplateManager.getDefaultInstance.getInternalTemplate("Sbt File") + +} From af098622daf93ef674f6adecc62e94848d0235b9 Mon Sep 17 00:00:00 2001 From: spawlak Date: Fri, 19 Apr 2024 18:15:33 +0200 Subject: [PATCH 2/3] Adding predefined plugin.sbt and build.sbt files #SCL-21374 --- .../META-INF/scala-plugin-common.xml | 12 +++++-- .../resources/messages/ScalaBundle.properties | 7 ++++ .../scala/actions/NewSbtBuildFileAction.scala | 36 +++++++++++++++++++ .../scala/actions/NewSbtFileAction.scala | 2 +- .../actions/NewSbtPluginFileAction.scala | 36 +++++++++++++++++++ 5 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtBuildFileAction.scala create mode 100644 scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtPluginFileAction.scala diff --git a/scala/scala-impl/resources/META-INF/scala-plugin-common.xml b/scala/scala-impl/resources/META-INF/scala-plugin-common.xml index aec23f45797..59dcb7cee9f 100644 --- a/scala/scala-impl/resources/META-INF/scala-plugin-common.xml +++ b/scala/scala-impl/resources/META-INF/scala-plugin-common.xml @@ -1983,9 +1983,15 @@ class="org.jetbrains.plugins.scala.components.TypeAwareWidgetFactory$Listener"/> - - - + + + + + + + + + diff --git a/scala/scala-impl/resources/messages/ScalaBundle.properties b/scala/scala-impl/resources/messages/ScalaBundle.properties index 224a7e1a428..393d556708a 100644 --- a/scala/scala-impl/resources/messages/ScalaBundle.properties +++ b/scala/scala-impl/resources/messages/ScalaBundle.properties @@ -41,8 +41,15 @@ create.new.scala.class.or.file=Create New Scala Class/File this.is.not.a.valid.scala.qualified.name=This is not a valid Scala qualified name newclassorfile.menu.action.sbt.text=Sbt File +newclassorfile.menu.action.build.sbt.text=Sbt Build File +newclassorfile.menu.action.build.sbt.defaultName=build +newclassorfile.menu.action.plugin.sbt.text=Sbt Plugin File +newclassorfile.menu.action.plugin.sbt.defaultName=plugin newclassorfile.menu.action.sbt.description=Create new Sbt File +error.package.already.contains.build.sbt=''build.sbt'' already exists for package ''{0}'' +error.package.already.contains.plugin.sbt=''plugin.sbt'' already exists for package ''{0}'' + ### org/jetbrains/plugins/scala/actions/ShowTypeInfoAction.scala type.info.text=Type Info type.info.description=Show Type Info diff --git a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtBuildFileAction.scala b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtBuildFileAction.scala new file mode 100644 index 00000000000..a502a23bb7f --- /dev/null +++ b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtBuildFileAction.scala @@ -0,0 +1,36 @@ +package org.jetbrains.plugins.scala.actions + +import com.intellij.ide.IdeView +import com.intellij.ide.fileTemplates.actions.{AttributesDefaults, CreateFromTemplateActionBase} +import com.intellij.ide.fileTemplates.{FileTemplate, FileTemplateManager} +import com.intellij.openapi.actionSystem.{CommonDataKeys, DataContext} +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.Messages +import com.intellij.psi.PsiDirectory +import org.jetbrains.plugins.scala.extensions.PsiNamedElementExt +import org.jetbrains.plugins.scala.ScalaBundle +import org.jetbrains.sbt.icons.Icons + +final class NewSbtBuildFileAction extends CreateFromTemplateActionBase( + ScalaBundle.message("newclassorfile.menu.action.build.sbt.text"), + ScalaBundle.message("newclassorfile.menu.action.sbt.description"), + Icons.SBT_FILE +) { + + override def getTemplate(project: Project, dir: PsiDirectory): FileTemplate = FileTemplateManager.getDefaultInstance.getInternalTemplate(ScalaBundle.message("newclassorfile.menu.action.sbt.text")) + + protected override def getAttributesDefaults(dataContext: DataContext): AttributesDefaults = new AttributesDefaults(ScalaBundle.message("newclassorfile.menu.action.build.sbt.defaultName")).withFixedName(true) + + override def getTargetDirectory(dataContext: DataContext, view: IdeView): PsiDirectory = { + val directories: Array[PsiDirectory] = view.getDirectories + for (directory <- directories) { + if (directory.findFile(ScalaBundle.message("newclassorfile.menu.action.build.sbt.defaultName") + ".sbt") != null) { + Messages.showErrorDialog(CommonDataKeys.PROJECT.getData(dataContext), + ScalaBundle.message("error.package.already.contains.build.sbt", directory.name), + "Cannot Create File") + return null + } + } + super.getTargetDirectory(dataContext, view) + } +} diff --git a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtFileAction.scala b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtFileAction.scala index 37b3cb20f85..73a0bb00492 100644 --- a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtFileAction.scala +++ b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtFileAction.scala @@ -13,6 +13,6 @@ final class NewSbtFileAction extends CreateFromTemplateActionBase( Icons.SBT_FILE ) { - override def getTemplate(project: Project, dir: PsiDirectory): FileTemplate = FileTemplateManager.getDefaultInstance.getInternalTemplate("Sbt File") + override def getTemplate(project: Project, dir: PsiDirectory): FileTemplate = FileTemplateManager.getDefaultInstance.getInternalTemplate(ScalaBundle.message("newclassorfile.menu.action.sbt.text")) } diff --git a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtPluginFileAction.scala b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtPluginFileAction.scala new file mode 100644 index 00000000000..b7afa6f76e2 --- /dev/null +++ b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtPluginFileAction.scala @@ -0,0 +1,36 @@ +package org.jetbrains.plugins.scala.actions + +import com.intellij.ide.IdeView +import com.intellij.ide.fileTemplates.actions.{AttributesDefaults, CreateFromTemplateActionBase} +import com.intellij.ide.fileTemplates.{FileTemplate, FileTemplateManager} +import com.intellij.openapi.actionSystem.{CommonDataKeys, DataContext} +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.Messages +import com.intellij.psi.PsiDirectory +import org.jetbrains.plugins.scala.ScalaBundle +import org.jetbrains.plugins.scala.extensions.PsiNamedElementExt +import org.jetbrains.sbt.icons.Icons + +final class NewSbtPluginFileAction extends CreateFromTemplateActionBase( + ScalaBundle.message("newclassorfile.menu.action.plugin.sbt.text"), + ScalaBundle.message("newclassorfile.menu.action.sbt.description"), + Icons.SBT_FILE +) { + + override def getTemplate(project: Project, dir: PsiDirectory): FileTemplate = FileTemplateManager.getDefaultInstance.getInternalTemplate(ScalaBundle.message("newclassorfile.menu.action.sbt.text")) + + protected override def getAttributesDefaults(dataContext: DataContext): AttributesDefaults = new AttributesDefaults(ScalaBundle.message("newclassorfile.menu.action.plugin.sbt.defaultName")).withFixedName(true) + + override def getTargetDirectory(dataContext: DataContext, view: IdeView): PsiDirectory = { + val directories: Array[PsiDirectory] = view.getDirectories + for (directory <- directories) { + if (directory.findFile(ScalaBundle.message("newclassorfile.menu.action.plugin.sbt.defaultName") + ".sbt") != null) { + Messages.showErrorDialog(CommonDataKeys.PROJECT.getData(dataContext), + ScalaBundle.message("error.package.already.contains.plugin.sbt", directory.name), + "Cannot Create File") + return null + } + } + super.getTargetDirectory(dataContext, view) + } +} From c633f55bc00010bdb81346a05f2839e036d7ae52 Mon Sep 17 00:00:00 2001 From: spawlak Date: Mon, 13 May 2024 15:32:50 +0200 Subject: [PATCH 3/3] Abstracting away common part for plugin and build file #SCL-21374 --- .../resources/messages/ScalaBundle.properties | 1 + .../actions/NewPredefinedSbtFileAction.scala | 31 +++++++++++++++++++ .../scala/actions/NewSbtBuildFileAction.scala | 31 +++---------------- .../actions/NewSbtPluginFileAction.scala | 31 +++---------------- 4 files changed, 42 insertions(+), 52 deletions(-) create mode 100644 scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewPredefinedSbtFileAction.scala diff --git a/scala/scala-impl/resources/messages/ScalaBundle.properties b/scala/scala-impl/resources/messages/ScalaBundle.properties index 393d556708a..711d585bd28 100644 --- a/scala/scala-impl/resources/messages/ScalaBundle.properties +++ b/scala/scala-impl/resources/messages/ScalaBundle.properties @@ -49,6 +49,7 @@ newclassorfile.menu.action.sbt.description=Create new Sbt File error.package.already.contains.build.sbt=''build.sbt'' already exists for package ''{0}'' error.package.already.contains.plugin.sbt=''plugin.sbt'' already exists for package ''{0}'' +error.title.package.already.contains.file=Cannot Create File ### org/jetbrains/plugins/scala/actions/ShowTypeInfoAction.scala type.info.text=Type Info diff --git a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewPredefinedSbtFileAction.scala b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewPredefinedSbtFileAction.scala new file mode 100644 index 00000000000..f62d326c6b5 --- /dev/null +++ b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewPredefinedSbtFileAction.scala @@ -0,0 +1,31 @@ +package org.jetbrains.plugins.scala.actions + +import com.intellij.ide.IdeView +import com.intellij.ide.fileTemplates.actions.CreateFromTemplateActionBase +import com.intellij.ide.fileTemplates.{FileTemplate, FileTemplateManager} +import com.intellij.openapi.actionSystem.{CommonDataKeys, DataContext} +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.Messages +import com.intellij.openapi.util.NlsActions +import com.intellij.psi.PsiDirectory +import org.jetbrains.plugins.scala.ScalaBundle +import org.jetbrains.plugins.scala.extensions.PsiNamedElementExt + +import javax.swing.Icon + +abstract class NewPredefinedSbtFileAction(@NlsActions.ActionText title: String, @NlsActions.ActionDescription description: String, icon: Icon, fileName: String) extends CreateFromTemplateActionBase(title, description, icon) { + + override def getTemplate(project: Project, dir: PsiDirectory): FileTemplate = FileTemplateManager.getDefaultInstance.getInternalTemplate(ScalaBundle.message("newclassorfile.menu.action.sbt.text")) + + override def getTargetDirectory(dataContext: DataContext, view: IdeView): PsiDirectory = { + val directories: Array[PsiDirectory] = view.getDirectories + directories.find(directory => directory.findFile(fileName + ".sbt") != null).exists(dir => { + Messages.showErrorDialog(CommonDataKeys.PROJECT.getData(dataContext), + ScalaBundle.message("error.package.already.contains.build.sbt", dir.name), + ScalaBundle.message("error.title.package.already.contains.file", dir.name)) + return null + } + ) + super.getTargetDirectory(dataContext, view) + } +} diff --git a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtBuildFileAction.scala b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtBuildFileAction.scala index a502a23bb7f..a31d82e279f 100644 --- a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtBuildFileAction.scala +++ b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtBuildFileAction.scala @@ -1,36 +1,15 @@ package org.jetbrains.plugins.scala.actions -import com.intellij.ide.IdeView -import com.intellij.ide.fileTemplates.actions.{AttributesDefaults, CreateFromTemplateActionBase} -import com.intellij.ide.fileTemplates.{FileTemplate, FileTemplateManager} -import com.intellij.openapi.actionSystem.{CommonDataKeys, DataContext} -import com.intellij.openapi.project.Project -import com.intellij.openapi.ui.Messages -import com.intellij.psi.PsiDirectory -import org.jetbrains.plugins.scala.extensions.PsiNamedElementExt +import com.intellij.ide.fileTemplates.actions.AttributesDefaults +import com.intellij.openapi.actionSystem.DataContext import org.jetbrains.plugins.scala.ScalaBundle import org.jetbrains.sbt.icons.Icons -final class NewSbtBuildFileAction extends CreateFromTemplateActionBase( +final class NewSbtBuildFileAction extends NewPredefinedSbtFileAction( ScalaBundle.message("newclassorfile.menu.action.build.sbt.text"), ScalaBundle.message("newclassorfile.menu.action.sbt.description"), - Icons.SBT_FILE + Icons.SBT_FILE, + ScalaBundle.message("newclassorfile.menu.action.build.sbt.defaultName") ) { - - override def getTemplate(project: Project, dir: PsiDirectory): FileTemplate = FileTemplateManager.getDefaultInstance.getInternalTemplate(ScalaBundle.message("newclassorfile.menu.action.sbt.text")) - protected override def getAttributesDefaults(dataContext: DataContext): AttributesDefaults = new AttributesDefaults(ScalaBundle.message("newclassorfile.menu.action.build.sbt.defaultName")).withFixedName(true) - - override def getTargetDirectory(dataContext: DataContext, view: IdeView): PsiDirectory = { - val directories: Array[PsiDirectory] = view.getDirectories - for (directory <- directories) { - if (directory.findFile(ScalaBundle.message("newclassorfile.menu.action.build.sbt.defaultName") + ".sbt") != null) { - Messages.showErrorDialog(CommonDataKeys.PROJECT.getData(dataContext), - ScalaBundle.message("error.package.already.contains.build.sbt", directory.name), - "Cannot Create File") - return null - } - } - super.getTargetDirectory(dataContext, view) - } } diff --git a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtPluginFileAction.scala b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtPluginFileAction.scala index b7afa6f76e2..53efce98048 100644 --- a/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtPluginFileAction.scala +++ b/scala/scala-impl/src/org/jetbrains/plugins/scala/actions/NewSbtPluginFileAction.scala @@ -1,36 +1,15 @@ package org.jetbrains.plugins.scala.actions -import com.intellij.ide.IdeView -import com.intellij.ide.fileTemplates.actions.{AttributesDefaults, CreateFromTemplateActionBase} -import com.intellij.ide.fileTemplates.{FileTemplate, FileTemplateManager} -import com.intellij.openapi.actionSystem.{CommonDataKeys, DataContext} -import com.intellij.openapi.project.Project -import com.intellij.openapi.ui.Messages -import com.intellij.psi.PsiDirectory +import com.intellij.ide.fileTemplates.actions.AttributesDefaults +import com.intellij.openapi.actionSystem.DataContext import org.jetbrains.plugins.scala.ScalaBundle -import org.jetbrains.plugins.scala.extensions.PsiNamedElementExt import org.jetbrains.sbt.icons.Icons -final class NewSbtPluginFileAction extends CreateFromTemplateActionBase( +final class NewSbtPluginFileAction extends NewPredefinedSbtFileAction( ScalaBundle.message("newclassorfile.menu.action.plugin.sbt.text"), ScalaBundle.message("newclassorfile.menu.action.sbt.description"), - Icons.SBT_FILE + Icons.SBT_FILE, + ScalaBundle.message("newclassorfile.menu.action.plugin.sbt.defaultName") ) { - - override def getTemplate(project: Project, dir: PsiDirectory): FileTemplate = FileTemplateManager.getDefaultInstance.getInternalTemplate(ScalaBundle.message("newclassorfile.menu.action.sbt.text")) - protected override def getAttributesDefaults(dataContext: DataContext): AttributesDefaults = new AttributesDefaults(ScalaBundle.message("newclassorfile.menu.action.plugin.sbt.defaultName")).withFixedName(true) - - override def getTargetDirectory(dataContext: DataContext, view: IdeView): PsiDirectory = { - val directories: Array[PsiDirectory] = view.getDirectories - for (directory <- directories) { - if (directory.findFile(ScalaBundle.message("newclassorfile.menu.action.plugin.sbt.defaultName") + ".sbt") != null) { - Messages.showErrorDialog(CommonDataKeys.PROJECT.getData(dataContext), - ScalaBundle.message("error.package.already.contains.plugin.sbt", directory.name), - "Cannot Create File") - return null - } - } - super.getTargetDirectory(dataContext, view) - } }