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:
@@ -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));
|
||||
}
|
||||
|
||||
+3
-2
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user