diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/ConfigureKotlinInProjectAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/ConfigureKotlinInProjectAction.kt index b6f93a77baa..568a171e3f1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/ConfigureKotlinInProjectAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/ConfigureKotlinInProjectAction.kt @@ -18,26 +18,23 @@ package org.jetbrains.kotlin.idea.actions import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.openapi.project.Project import com.intellij.openapi.ui.Messages -import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator -import org.jetbrains.kotlin.idea.configuration.getAbleToRunConfigurators -import org.jetbrains.kotlin.idea.configuration.isProjectConfigured -import org.jetbrains.kotlin.idea.configuration.showConfigureKotlinNotificationIfNeeded +import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform +import org.jetbrains.kotlin.utils.ifEmpty abstract class ConfigureKotlinInProjectAction : AnAction() { abstract fun getApplicableConfigurators(project: Project): Collection override fun actionPerformed(e: AnActionEvent) { - val project = CommonDataKeys.PROJECT.getData(e.dataContext) - if (project == null) return + val project = e.project ?: return - if (isProjectConfigured(project)) { - Messages.showInfoMessage("All modules with kotlin files are configured", e.presentation.getText()!!) + val modules = getModulesWithKotlinFiles(project).ifEmpty { project.allModules() } + if (modules.all { isModuleConfigured(it) }) { + Messages.showInfoMessage("All modules with Kotlin files are configured", e.presentation.text!!) return } @@ -47,7 +44,7 @@ abstract class ConfigureKotlinInProjectAction : AnAction() { configurators.size == 1 -> configurators.first().configure(project) configurators.isEmpty() -> Messages.showErrorDialog("There aren't configurators available", e.presentation.text!!) else -> { - Messages.showErrorDialog("More than one configurator is available", e.presentation.getText()!!) + Messages.showErrorDialog("More than one configurator is available", e.presentation.text!!) showConfigureKotlinNotificationIfNeeded(project) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index 5b98c51f4fa..bca67af98ff 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -26,12 +26,15 @@ import com.intellij.openapi.project.Project import com.intellij.psi.search.FileTypeIndex import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.idea.KotlinFileType +import org.jetbrains.kotlin.utils.ifEmpty fun isProjectConfigured(project: Project): Boolean { val modules = getModulesWithKotlinFiles(project) return modules.all { isModuleConfigured(it) } } +fun Project.allModules() = ModuleManager.getInstance(this).modules.toList() + fun isModuleConfigured(module: Module): Boolean { val configurators = getApplicableConfigurators(module) return configurators.any { it.isConfigured(module) } @@ -46,7 +49,7 @@ fun getModulesWithKotlinFiles(project: Project): Collection { return emptyList() } - return ModuleManager.getInstance(project).modules.filter { module -> + return project.allModules().filter { module -> FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(true)) } } @@ -68,7 +71,7 @@ private fun showConfigureKotlinNotification(project: Project) { } fun getAbleToRunConfigurators(project: Project): Collection { - val modules = getModulesWithKotlinFiles(project) + val modules = getModulesWithKotlinFiles(project).ifEmpty { project.allModules() } return Extensions.getExtensions(KotlinProjectConfigurator.EP_NAME).filter { configurator -> modules.any { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) } @@ -84,6 +87,10 @@ fun getConfiguratorByName(name: String): KotlinProjectConfigurator? { } fun getNonConfiguredModules(project: Project, configurator: KotlinProjectConfigurator): List { + return project.allModules().filter { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) } +} + +fun getNonConfiguredModulesWithKotlinFiles(project: Project, configurator: KotlinProjectConfigurator): List { val modules = getModulesWithKotlinFiles(project) return modules.filter { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMavenConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMavenConfigurator.java index 344637cc136..070a4ce5b2c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMavenConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMavenConfigurator.java @@ -110,10 +110,8 @@ public abstract class KotlinMavenConfigurator implements KotlinProjectConfigurat @Override public void configure(@NotNull Project project) { - List nonConfiguredModules = ConfigureKotlinInProjectUtilsKt.getNonConfiguredModules(project, this); - ConfigureDialogWithModulesAndVersion dialog = - new ConfigureDialogWithModulesAndVersion(project, nonConfiguredModules, KOTLIN_VERSIONS); + new ConfigureDialogWithModulesAndVersion(project, this, KOTLIN_VERSIONS); dialog.show(); if (!dialog.isOK()) return; diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java index d2be3f3a146..7316fe7616c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java @@ -49,7 +49,6 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrM import org.jetbrains.plugins.groovy.lang.psi.api.util.GrStatementOwner; import java.io.File; -import java.util.List; import static org.jetbrains.kotlin.idea.configuration.ConfigureKotlinInProjectUtilsKt.showInfoNotification; @@ -86,10 +85,8 @@ public abstract class KotlinWithGradleConfigurator implements KotlinProjectConfi @Override public void configure(@NotNull Project project) { - List nonConfiguredModules = ConfigureKotlinInProjectUtilsKt.getNonConfiguredModules(project, this); - ConfigureDialogWithModulesAndVersion dialog = - new ConfigureDialogWithModulesAndVersion(project, nonConfiguredModules, KOTLIN_VERSIONS); + new ConfigureDialogWithModulesAndVersion(project, this, KOTLIN_VERSIONS); dialog.show(); if (!dialog.isOK()) return; diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java index e003c89d709..6c4adb5eac9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java @@ -89,7 +89,7 @@ public abstract class KotlinWithLibraryConfigurator implements KotlinProjectConf if (nonConfiguredModules.size() > 1 || showPathToJarPanel) { CreateLibraryDialogWithModules dialog = new CreateLibraryDialogWithModules( - project, nonConfiguredModules, defaultPathToJar, showPathToJarPanel, + project, this, defaultPathToJar, showPathToJarPanel, getDialogTitle(), getLibraryCaption()); diff --git a/idea/src/org/jetbrains/kotlin/idea/framework/ui/ChooseModulePanel.form b/idea/src/org/jetbrains/kotlin/idea/framework/ui/ChooseModulePanel.form index bdb8b28d305..25b48526cf7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/framework/ui/ChooseModulePanel.form +++ b/idea/src/org/jetbrains/kotlin/idea/framework/ui/ChooseModulePanel.form @@ -1,6 +1,6 @@
- + @@ -10,7 +10,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -26,12 +26,12 @@ - + - + - + @@ -43,12 +43,20 @@ - + + + + + + + + + diff --git a/idea/src/org/jetbrains/kotlin/idea/framework/ui/ChooseModulePanel.java b/idea/src/org/jetbrains/kotlin/idea/framework/ui/ChooseModulePanel.java index de71d2a52a6..f3e798ad06c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/framework/ui/ChooseModulePanel.java +++ b/idea/src/org/jetbrains/kotlin/idea/framework/ui/ChooseModulePanel.java @@ -22,6 +22,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.idea.configuration.ConfigureKotlinInProjectUtilsKt; +import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator; import javax.swing.*; import java.awt.event.ActionEvent; @@ -34,14 +36,17 @@ public class ChooseModulePanel { private JRadioButton allModulesWithKtRadioButton; private JRadioButton singleModuleRadioButton; private JComboBox singleModuleComboBox; - private JTextField allModulesNames; + private JTextField allModulesWithKtNames; + private JRadioButton allModulesRadioButton; @NotNull private final Project project; @NotNull private final List modules; + @NotNull private final List modulesWithKtFiles; - public ChooseModulePanel(@NotNull Project project, @NotNull List modules) { + public ChooseModulePanel(@NotNull Project project, @NotNull KotlinProjectConfigurator configurator) { this.project = project; - this.modules = modules; + this.modules = ConfigureKotlinInProjectUtilsKt.getNonConfiguredModules(project, configurator); + this.modulesWithKtFiles = ConfigureKotlinInProjectUtilsKt.getNonConfiguredModulesWithKotlinFiles(project, configurator); DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(); @@ -49,19 +54,21 @@ public class ChooseModulePanel { comboBoxModel.addElement(module.getName()); } + if (modulesWithKtFiles.isEmpty()) { + allModulesWithKtRadioButton.setVisible(false); + allModulesWithKtNames.setVisible(false); + } + singleModuleComboBox.setModel(comboBoxModel); - singleModuleRadioButton.addActionListener(new ActionListener() { + ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateComponents(); } - }); - allModulesWithKtRadioButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - updateComponents(); - } - }); + }; + singleModuleRadioButton.addActionListener(listener); + allModulesWithKtRadioButton.addActionListener(listener); + allModulesRadioButton.addActionListener(listener); String fullList = StringUtil.join(modules, new Function() { @Override @@ -69,13 +76,20 @@ public class ChooseModulePanel { return module.getName(); } }, ", "); - allModulesNames.setText(fullList); - allModulesNames.setBorder(null); + allModulesWithKtNames.setText(fullList); + allModulesWithKtNames.setBorder(null); ButtonGroup modulesGroup = new ButtonGroup(); + modulesGroup.add(allModulesRadioButton); modulesGroup.add(allModulesWithKtRadioButton); modulesGroup.add(singleModuleRadioButton); - allModulesWithKtRadioButton.setSelected(true); + + if (allModulesWithKtRadioButton.isVisible()) { + allModulesWithKtRadioButton.setSelected(true); + } + else { + allModulesRadioButton.setSelected(true); + } updateComponents(); } @@ -89,7 +103,8 @@ public class ChooseModulePanel { } public List getModulesToConfigure() { - if (allModulesWithKtRadioButton.isSelected()) return modules; + if (allModulesRadioButton.isSelected()) return modules; + if (allModulesWithKtRadioButton.isSelected()) return modulesWithKtFiles; String selectedItem = (String) singleModuleComboBox.getSelectedItem(); return Collections.singletonList(ModuleManager.getInstance(project).findModuleByName(selectedItem)); } diff --git a/idea/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.java b/idea/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.java index 85f516970bd..0284cd1e8b7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.java +++ b/idea/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.java @@ -33,6 +33,7 @@ import com.intellij.util.ui.AsyncProcessIcon; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator; import javax.swing.*; import java.awt.*; @@ -60,7 +61,7 @@ public class ConfigureDialogWithModulesAndVersion extends DialogWrapper { public ConfigureDialogWithModulesAndVersion( @NotNull Project project, - @NotNull List modules, + @NotNull KotlinProjectConfigurator configurator, @NotNull final String[] kotlinVersions ) { super(project); @@ -89,7 +90,7 @@ public class ConfigureDialogWithModulesAndVersion extends DialogWrapper { processIcon.resume(); infoPanel.add(processIcon, BorderLayout.CENTER); - chooseModulePanel = new ChooseModulePanel(project, modules); + chooseModulePanel = new ChooseModulePanel(project, configurator); chooseModulesPanelPlace.add(chooseModulePanel.getContentPane(), BorderLayout.CENTER); updateComponents(); diff --git a/idea/src/org/jetbrains/kotlin/idea/framework/ui/CreateLibraryDialogWithModules.java b/idea/src/org/jetbrains/kotlin/idea/framework/ui/CreateLibraryDialogWithModules.java index 626ab326462..1ebd81b87ca 100644 --- a/idea/src/org/jetbrains/kotlin/idea/framework/ui/CreateLibraryDialogWithModules.java +++ b/idea/src/org/jetbrains/kotlin/idea/framework/ui/CreateLibraryDialogWithModules.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.framework.ui; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator; import java.awt.*; import java.util.List; @@ -29,7 +30,7 @@ public class CreateLibraryDialogWithModules extends CreateLibraryDialogBase { public CreateLibraryDialogWithModules( @NotNull Project project, - @NotNull List modules, + @NotNull KotlinProjectConfigurator configurator, @NotNull String defaultPath, boolean showPathPanel, @NotNull String title, @@ -37,7 +38,7 @@ public class CreateLibraryDialogWithModules extends CreateLibraryDialogBase { ) { super(project, defaultPath, title, libraryCaption); - chooseModulePanel = new ChooseModulePanel(project, modules); + chooseModulePanel = new ChooseModulePanel(project, configurator); chooseModulesPanelPlace.add(chooseModulePanel.getContentPane(), BorderLayout.CENTER); chooseLibraryPathPlace.setVisible(showPathPanel);