offer "All modules" choice in "Configure Kotlin in project" dialog, allow to invoke the action when there are no Kotlin files in the project

#KT-7979 Fixed
This commit is contained in:
Dmitry Jemerov
2015-11-17 16:26:21 +01:00
parent 4ffac80710
commit 6c2a2b91b4
9 changed files with 70 additions and 46 deletions
@@ -18,26 +18,23 @@ package org.jetbrains.kotlin.idea.actions
import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages import com.intellij.openapi.ui.Messages
import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator import org.jetbrains.kotlin.idea.configuration.*
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.js.resolve.JsPlatform import org.jetbrains.kotlin.js.resolve.JsPlatform
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
import org.jetbrains.kotlin.utils.ifEmpty
abstract class ConfigureKotlinInProjectAction : AnAction() { abstract class ConfigureKotlinInProjectAction : AnAction() {
abstract fun getApplicableConfigurators(project: Project): Collection<KotlinProjectConfigurator> abstract fun getApplicableConfigurators(project: Project): Collection<KotlinProjectConfigurator>
override fun actionPerformed(e: AnActionEvent) { override fun actionPerformed(e: AnActionEvent) {
val project = CommonDataKeys.PROJECT.getData(e.dataContext) val project = e.project ?: return
if (project == null) return
if (isProjectConfigured(project)) { val modules = getModulesWithKotlinFiles(project).ifEmpty { project.allModules() }
Messages.showInfoMessage("All modules with kotlin files are configured", e.presentation.getText()!!) if (modules.all { isModuleConfigured(it) }) {
Messages.showInfoMessage("All modules with Kotlin files are configured", e.presentation.text!!)
return return
} }
@@ -47,7 +44,7 @@ abstract class ConfigureKotlinInProjectAction : AnAction() {
configurators.size == 1 -> configurators.first().configure(project) configurators.size == 1 -> configurators.first().configure(project)
configurators.isEmpty() -> Messages.showErrorDialog("There aren't configurators available", e.presentation.text!!) configurators.isEmpty() -> Messages.showErrorDialog("There aren't configurators available", e.presentation.text!!)
else -> { 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) showConfigureKotlinNotificationIfNeeded(project)
} }
} }
@@ -26,12 +26,15 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.FileTypeIndex import com.intellij.psi.search.FileTypeIndex
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.utils.ifEmpty
fun isProjectConfigured(project: Project): Boolean { fun isProjectConfigured(project: Project): Boolean {
val modules = getModulesWithKotlinFiles(project) val modules = getModulesWithKotlinFiles(project)
return modules.all { isModuleConfigured(it) } return modules.all { isModuleConfigured(it) }
} }
fun Project.allModules() = ModuleManager.getInstance(this).modules.toList()
fun isModuleConfigured(module: Module): Boolean { fun isModuleConfigured(module: Module): Boolean {
val configurators = getApplicableConfigurators(module) val configurators = getApplicableConfigurators(module)
return configurators.any { it.isConfigured(module) } return configurators.any { it.isConfigured(module) }
@@ -46,7 +49,7 @@ fun getModulesWithKotlinFiles(project: Project): Collection<Module> {
return emptyList() return emptyList()
} }
return ModuleManager.getInstance(project).modules.filter { module -> return project.allModules().filter { module ->
FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(true)) FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(true))
} }
} }
@@ -68,7 +71,7 @@ private fun showConfigureKotlinNotification(project: Project) {
} }
fun getAbleToRunConfigurators(project: Project): Collection<KotlinProjectConfigurator> { fun getAbleToRunConfigurators(project: Project): Collection<KotlinProjectConfigurator> {
val modules = getModulesWithKotlinFiles(project) val modules = getModulesWithKotlinFiles(project).ifEmpty { project.allModules() }
return Extensions.getExtensions(KotlinProjectConfigurator.EP_NAME).filter { configurator -> return Extensions.getExtensions(KotlinProjectConfigurator.EP_NAME).filter { configurator ->
modules.any { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) } 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<Module> { fun getNonConfiguredModules(project: Project, configurator: KotlinProjectConfigurator): List<Module> {
return project.allModules().filter { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) }
}
fun getNonConfiguredModulesWithKotlinFiles(project: Project, configurator: KotlinProjectConfigurator): List<Module> {
val modules = getModulesWithKotlinFiles(project) val modules = getModulesWithKotlinFiles(project)
return modules.filter { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) } return modules.filter { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) }
} }
@@ -110,10 +110,8 @@ public abstract class KotlinMavenConfigurator implements KotlinProjectConfigurat
@Override @Override
public void configure(@NotNull Project project) { public void configure(@NotNull Project project) {
List<Module> nonConfiguredModules = ConfigureKotlinInProjectUtilsKt.getNonConfiguredModules(project, this);
ConfigureDialogWithModulesAndVersion dialog = ConfigureDialogWithModulesAndVersion dialog =
new ConfigureDialogWithModulesAndVersion(project, nonConfiguredModules, KOTLIN_VERSIONS); new ConfigureDialogWithModulesAndVersion(project, this, KOTLIN_VERSIONS);
dialog.show(); dialog.show();
if (!dialog.isOK()) return; if (!dialog.isOK()) return;
@@ -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 org.jetbrains.plugins.groovy.lang.psi.api.util.GrStatementOwner;
import java.io.File; import java.io.File;
import java.util.List;
import static org.jetbrains.kotlin.idea.configuration.ConfigureKotlinInProjectUtilsKt.showInfoNotification; import static org.jetbrains.kotlin.idea.configuration.ConfigureKotlinInProjectUtilsKt.showInfoNotification;
@@ -86,10 +85,8 @@ public abstract class KotlinWithGradleConfigurator implements KotlinProjectConfi
@Override @Override
public void configure(@NotNull Project project) { public void configure(@NotNull Project project) {
List<Module> nonConfiguredModules = ConfigureKotlinInProjectUtilsKt.getNonConfiguredModules(project, this);
ConfigureDialogWithModulesAndVersion dialog = ConfigureDialogWithModulesAndVersion dialog =
new ConfigureDialogWithModulesAndVersion(project, nonConfiguredModules, KOTLIN_VERSIONS); new ConfigureDialogWithModulesAndVersion(project, this, KOTLIN_VERSIONS);
dialog.show(); dialog.show();
if (!dialog.isOK()) return; if (!dialog.isOK()) return;
@@ -89,7 +89,7 @@ public abstract class KotlinWithLibraryConfigurator implements KotlinProjectConf
if (nonConfiguredModules.size() > 1 || showPathToJarPanel) { if (nonConfiguredModules.size() > 1 || showPathToJarPanel) {
CreateLibraryDialogWithModules dialog = new CreateLibraryDialogWithModules( CreateLibraryDialogWithModules dialog = new CreateLibraryDialogWithModules(
project, nonConfiguredModules, defaultPathToJar, showPathToJarPanel, project, this, defaultPathToJar, showPathToJarPanel,
getDialogTitle(), getDialogTitle(),
getLibraryCaption()); getLibraryCaption());
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="org.jetbrains.kotlin.idea.framework.ui.ChooseModulePanel"> <form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="org.jetbrains.kotlin.idea.framework.ui.ChooseModulePanel">
<grid id="27dc6" binding="contentPane" layout-manager="GridLayoutManager" row-count="3" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1"> <grid id="27dc6" binding="contentPane" layout-manager="GridLayoutManager" row-count="4" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/> <margin top="0" left="0" bottom="0" right="0"/>
<constraints> <constraints>
<xy x="20" y="20" width="465" height="400"/> <xy x="20" y="20" width="465" height="400"/>
@@ -10,7 +10,7 @@
<children> <children>
<component id="e348f" class="javax.swing.JRadioButton" binding="singleModuleRadioButton" default-binding="true"> <component id="e348f" class="javax.swing.JRadioButton" binding="singleModuleRadioButton" default-binding="true">
<constraints> <constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/> <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints> </constraints>
<properties> <properties>
<text value="Single module:"/> <text value="Single module:"/>
@@ -18,7 +18,7 @@
</component> </component>
<component id="8acf5" class="javax.swing.JComboBox" binding="singleModuleComboBox"> <component id="8acf5" class="javax.swing.JComboBox" binding="singleModuleComboBox">
<constraints> <constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/> <grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints> </constraints>
<properties> <properties>
<model/> <model/>
@@ -26,12 +26,12 @@
</component> </component>
<vspacer id="72c0e"> <vspacer id="72c0e">
<constraints> <constraints>
<grid row="2" column="0" row-span="1" col-span="3" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/> <grid row="3" column="0" row-span="1" col-span="3" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints> </constraints>
</vspacer> </vspacer>
<component id="5ca07" class="javax.swing.JTextField" binding="allModulesNames"> <component id="5ca07" class="javax.swing.JTextField" binding="allModulesWithKtNames">
<constraints> <constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="150" height="-1"/> <preferred-size width="150" height="-1"/>
<maximum-size width="-1" height="100"/> <maximum-size width="-1" height="100"/>
</grid> </grid>
@@ -43,12 +43,20 @@
</component> </component>
<component id="6717d" class="javax.swing.JRadioButton" binding="allModulesWithKtRadioButton" default-binding="true"> <component id="6717d" class="javax.swing.JRadioButton" binding="allModulesWithKtRadioButton" default-binding="true">
<constraints> <constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/> <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints> </constraints>
<properties> <properties>
<text value="All modules containing Kotlin files: "/> <text value="All modules containing Kotlin files: "/>
</properties> </properties>
</component> </component>
<component id="5e532" class="javax.swing.JRadioButton" binding="allModulesRadioButton">
<constraints>
<grid row="0" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="All modules"/>
</properties>
</component>
</children> </children>
</grid> </grid>
</form> </form>
@@ -22,6 +22,8 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.Function; import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.idea.configuration.ConfigureKotlinInProjectUtilsKt;
import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator;
import javax.swing.*; import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@@ -34,14 +36,17 @@ public class ChooseModulePanel {
private JRadioButton allModulesWithKtRadioButton; private JRadioButton allModulesWithKtRadioButton;
private JRadioButton singleModuleRadioButton; private JRadioButton singleModuleRadioButton;
private JComboBox singleModuleComboBox; private JComboBox singleModuleComboBox;
private JTextField allModulesNames; private JTextField allModulesWithKtNames;
private JRadioButton allModulesRadioButton;
@NotNull private final Project project; @NotNull private final Project project;
@NotNull private final List<Module> modules; @NotNull private final List<Module> modules;
@NotNull private final List<Module> modulesWithKtFiles;
public ChooseModulePanel(@NotNull Project project, @NotNull List<Module> modules) { public ChooseModulePanel(@NotNull Project project, @NotNull KotlinProjectConfigurator configurator) {
this.project = project; this.project = project;
this.modules = modules; this.modules = ConfigureKotlinInProjectUtilsKt.getNonConfiguredModules(project, configurator);
this.modulesWithKtFiles = ConfigureKotlinInProjectUtilsKt.getNonConfiguredModulesWithKotlinFiles(project, configurator);
DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(); DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel();
@@ -49,19 +54,21 @@ public class ChooseModulePanel {
comboBoxModel.addElement(module.getName()); comboBoxModel.addElement(module.getName());
} }
if (modulesWithKtFiles.isEmpty()) {
allModulesWithKtRadioButton.setVisible(false);
allModulesWithKtNames.setVisible(false);
}
singleModuleComboBox.setModel(comboBoxModel); singleModuleComboBox.setModel(comboBoxModel);
singleModuleRadioButton.addActionListener(new ActionListener() { ActionListener listener = new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
updateComponents(); updateComponents();
} }
}); };
allModulesWithKtRadioButton.addActionListener(new ActionListener() { singleModuleRadioButton.addActionListener(listener);
@Override allModulesWithKtRadioButton.addActionListener(listener);
public void actionPerformed(ActionEvent e) { allModulesRadioButton.addActionListener(listener);
updateComponents();
}
});
String fullList = StringUtil.join(modules, new Function<Module, String>() { String fullList = StringUtil.join(modules, new Function<Module, String>() {
@Override @Override
@@ -69,13 +76,20 @@ public class ChooseModulePanel {
return module.getName(); return module.getName();
} }
}, ", "); }, ", ");
allModulesNames.setText(fullList); allModulesWithKtNames.setText(fullList);
allModulesNames.setBorder(null); allModulesWithKtNames.setBorder(null);
ButtonGroup modulesGroup = new ButtonGroup(); ButtonGroup modulesGroup = new ButtonGroup();
modulesGroup.add(allModulesRadioButton);
modulesGroup.add(allModulesWithKtRadioButton); modulesGroup.add(allModulesWithKtRadioButton);
modulesGroup.add(singleModuleRadioButton); modulesGroup.add(singleModuleRadioButton);
allModulesWithKtRadioButton.setSelected(true);
if (allModulesWithKtRadioButton.isVisible()) {
allModulesWithKtRadioButton.setSelected(true);
}
else {
allModulesRadioButton.setSelected(true);
}
updateComponents(); updateComponents();
} }
@@ -89,7 +103,8 @@ public class ChooseModulePanel {
} }
public List<Module> getModulesToConfigure() { public List<Module> getModulesToConfigure() {
if (allModulesWithKtRadioButton.isSelected()) return modules; if (allModulesRadioButton.isSelected()) return modules;
if (allModulesWithKtRadioButton.isSelected()) return modulesWithKtFiles;
String selectedItem = (String) singleModuleComboBox.getSelectedItem(); String selectedItem = (String) singleModuleComboBox.getSelectedItem();
return Collections.singletonList(ModuleManager.getInstance(project).findModuleByName(selectedItem)); return Collections.singletonList(ModuleManager.getInstance(project).findModuleByName(selectedItem));
} }
@@ -33,6 +33,7 @@ import com.intellij.util.ui.AsyncProcessIcon;
import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
@@ -60,7 +61,7 @@ public class ConfigureDialogWithModulesAndVersion extends DialogWrapper {
public ConfigureDialogWithModulesAndVersion( public ConfigureDialogWithModulesAndVersion(
@NotNull Project project, @NotNull Project project,
@NotNull List<Module> modules, @NotNull KotlinProjectConfigurator configurator,
@NotNull final String[] kotlinVersions @NotNull final String[] kotlinVersions
) { ) {
super(project); super(project);
@@ -89,7 +90,7 @@ public class ConfigureDialogWithModulesAndVersion extends DialogWrapper {
processIcon.resume(); processIcon.resume();
infoPanel.add(processIcon, BorderLayout.CENTER); infoPanel.add(processIcon, BorderLayout.CENTER);
chooseModulePanel = new ChooseModulePanel(project, modules); chooseModulePanel = new ChooseModulePanel(project, configurator);
chooseModulesPanelPlace.add(chooseModulePanel.getContentPane(), BorderLayout.CENTER); chooseModulesPanelPlace.add(chooseModulePanel.getContentPane(), BorderLayout.CENTER);
updateComponents(); updateComponents();
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.framework.ui;
import com.intellij.openapi.module.Module; import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator;
import java.awt.*; import java.awt.*;
import java.util.List; import java.util.List;
@@ -29,7 +30,7 @@ public class CreateLibraryDialogWithModules extends CreateLibraryDialogBase {
public CreateLibraryDialogWithModules( public CreateLibraryDialogWithModules(
@NotNull Project project, @NotNull Project project,
@NotNull List<Module> modules, @NotNull KotlinProjectConfigurator configurator,
@NotNull String defaultPath, @NotNull String defaultPath,
boolean showPathPanel, boolean showPathPanel,
@NotNull String title, @NotNull String title,
@@ -37,7 +38,7 @@ public class CreateLibraryDialogWithModules extends CreateLibraryDialogBase {
) { ) {
super(project, defaultPath, title, libraryCaption); super(project, defaultPath, title, libraryCaption);
chooseModulePanel = new ChooseModulePanel(project, modules); chooseModulePanel = new ChooseModulePanel(project, configurator);
chooseModulesPanelPlace.add(chooseModulePanel.getContentPane(), BorderLayout.CENTER); chooseModulesPanelPlace.add(chooseModulePanel.getContentPane(), BorderLayout.CENTER);
chooseLibraryPathPlace.setVisible(showPathPanel); chooseLibraryPathPlace.setVisible(showPathPanel);