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.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<KotlinProjectConfigurator>
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)
}
}
@@ -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<Module> {
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<KotlinProjectConfigurator> {
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<Module> {
return project.allModules().filter { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) }
}
fun getNonConfiguredModulesWithKotlinFiles(project: Project, configurator: KotlinProjectConfigurator): List<Module> {
val modules = getModulesWithKotlinFiles(project)
return modules.filter { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) }
}
@@ -110,10 +110,8 @@ public abstract class KotlinMavenConfigurator implements KotlinProjectConfigurat
@Override
public void configure(@NotNull Project project) {
List<Module> 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;
@@ -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<Module> 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;
@@ -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());
@@ -1,6 +1,6 @@
<?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">
<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"/>
<constraints>
<xy x="20" y="20" width="465" height="400"/>
@@ -10,7 +10,7 @@
<children>
<component id="e348f" class="javax.swing.JRadioButton" binding="singleModuleRadioButton" default-binding="true">
<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>
<properties>
<text value="Single module:"/>
@@ -18,7 +18,7 @@
</component>
<component id="8acf5" class="javax.swing.JComboBox" binding="singleModuleComboBox">
<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>
<properties>
<model/>
@@ -26,12 +26,12 @@
</component>
<vspacer id="72c0e">
<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>
</vspacer>
<component id="5ca07" class="javax.swing.JTextField" binding="allModulesNames">
<component id="5ca07" class="javax.swing.JTextField" binding="allModulesWithKtNames">
<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"/>
<maximum-size width="-1" height="100"/>
</grid>
@@ -43,12 +43,20 @@
</component>
<component id="6717d" class="javax.swing.JRadioButton" binding="allModulesWithKtRadioButton" default-binding="true">
<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>
<properties>
<text value="All modules containing Kotlin files: "/>
</properties>
</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>
</grid>
</form>
@@ -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<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.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<Module, String>() {
@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<Module> 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));
}
@@ -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<Module> 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();
@@ -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<Module> 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);