From c264a2e15f86d032b5cd5f04a6e929be682c093f Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 16 Mar 2017 02:37:35 +0300 Subject: [PATCH] Configuration: Improve presentation of the settings override warning --- .../KotlinCompilerConfigurableTab.form | 4 +- .../KotlinCompilerConfigurableTab.java | 49 +++++++++++++++++-- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form index b132a5e938b..87b3b647b21 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form @@ -170,9 +170,7 @@ - - - + diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java index eefbe40a313..da8a366ecb9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java @@ -37,6 +37,7 @@ import com.intellij.util.text.VersionComparatorUtil; import com.intellij.util.ui.ThreeStateCheckBox; import com.intellij.util.ui.UIUtil; import kotlin.collections.ArraysKt; +import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function0; import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.Nls; @@ -68,6 +69,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co private static final List languageFeatureStates = Arrays.asList( LanguageFeature.State.ENABLED, LanguageFeature.State.ENABLED_WITH_WARNING, LanguageFeature.State.ENABLED_WITH_ERROR ); + private static final int MAX_WARNING_SIZE = 75; static { moduleKindDescriptions.put(K2JsArgumentConstants.MODULE_PLAIN, "Plain (put to global scope)"); @@ -111,7 +113,6 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co private JLabel labelForOutputPrefixFile; private JLabel labelForOutputPostfixFile; private JLabel warningLabel; - private boolean isEnabled = true; public KotlinCompilerConfigurableTab( @@ -196,13 +197,14 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co if (facet == null) return null; KotlinFacetSettings facetSettings = facet.getConfiguration().getSettings(); if (facetSettings.getUseProjectSettings()) return null; - return "" + module.getName() + ""; + return module.getName(); } } ); + CollectionsKt.sort(modulesOverridingProjectSettings); if (!modulesOverridingProjectSettings.isEmpty()) { warningLabel.setVisible(true); - warningLabel.setText("Following modules override project settings: " + StringUtil.join(modulesOverridingProjectSettings, ", ")); + warningLabel.setText(buildOverridingModulesWarning(modulesOverridingProjectSettings)); } } } @@ -219,6 +221,47 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co false); } + private static int calculateNameCountToShowInWarning(List allNames) { + int lengthSoFar = 0; + int size = allNames.size(); + for (int i = 0; i < size; i++) { + lengthSoFar = (i > 0 ? lengthSoFar + 2 : 0) + allNames.get(i).length(); + if (lengthSoFar > MAX_WARNING_SIZE) return i; + } + return size; + } + + @NotNull + private static String buildOverridingModulesWarning(List modulesOverridingProjectSettings) { + int nameCountToShow = calculateNameCountToShowInWarning(modulesOverridingProjectSettings); + int allNamesCount = modulesOverridingProjectSettings.size(); + if (nameCountToShow == 0) { + return String.valueOf(allNamesCount) + " modules override project settings"; + } + + StringBuilder builder = new StringBuilder(); + builder.append("Following modules override project settings: "); + CollectionsKt.joinTo( + modulesOverridingProjectSettings.subList(0, nameCountToShow), + builder, + ", ", + "", + "", + -1, + "", + new Function1() { + @Override + public CharSequence invoke(String s) { + return "" + s + ""; + } + } + ); + if (nameCountToShow < allNamesCount) { + builder.append(" and ").append(allNamesCount - nameCountToShow).append(" other(s)"); + } + return builder.toString(); + } + @NotNull private static String getModuleKindDescription(@NotNull String moduleKind) { String result = moduleKindDescriptions.get(moduleKind);