From f4a3a5bfae46207f8d46069148a58d74db93ded6 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Tue, 27 Aug 2024 19:15:07 +0200 Subject: [PATCH] vcs: preselect default vcs in "Add VCS Directory Mapping" dialog GitOrigin-RevId: f505d16a570ae87d927b32f0df29e783e12617ca --- platform/vcs-impl/api-dump.txt | 3 +++ .../ide/actions/StartUseVcsDialog.java | 10 ++------ .../configurable/SuggestedVcsComparator.kt | 25 +++++++++++++++++++ .../VcsDirectoryConfigurationPanel.kt | 10 ++++---- .../VcsMappingConfigurationDialog.java | 9 +++++-- 5 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/SuggestedVcsComparator.kt diff --git a/platform/vcs-impl/api-dump.txt b/platform/vcs-impl/api-dump.txt index fe948fcb30fe..304b5ad02cd1 100644 --- a/platform/vcs-impl/api-dump.txt +++ b/platform/vcs-impl/api-dump.txt @@ -5688,6 +5688,9 @@ c:com.intellij.openapi.vcs.configurable.ShelfStorageConfigurationDialog - p:doValidate():com.intellij.openapi.ui.ValidationInfo - p:getHelpId():java.lang.String - p:postponeValidation():Z +f:com.intellij.openapi.vcs.configurable.SuggestedVcsComparator +- sf:INSTANCE:com.intellij.openapi.vcs.configurable.SuggestedVcsComparator +- sf:create(com.intellij.openapi.project.Project):java.util.Comparator a:com.intellij.openapi.vcs.configurable.VcsCheckBoxWithSpinnerConfigurable - com.intellij.openapi.options.Configurable - p:myHighlightInterval:javax.swing.JSpinner diff --git a/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsDialog.java b/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsDialog.java index 5200ee45c402..96f0e2fbf4b9 100644 --- a/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsDialog.java +++ b/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsDialog.java @@ -8,39 +8,33 @@ import com.intellij.openapi.ui.MultiLineLabelUI; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.VcsBundle; +import com.intellij.openapi.vcs.configurable.SuggestedVcsComparator; import com.intellij.ui.SimpleListCellRenderer; import com.intellij.util.PathUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.JBInsets; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.NamedColorUtil; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; -import java.util.Comparator; import static com.intellij.openapi.util.SystemInfo.isMac; public final class StartUseVcsDialog extends DialogWrapper { - @NonNls private static final String GIT = "Git"; private final ComboBox myVcsCombo; @NotNull private final String myTargetDirectory; - private static final Comparator VCS_COMPARATOR = Comparator - .comparingInt((AbstractVcs vcs) -> GIT.equals(vcs.getName()) ? -1 : 0) - .thenComparing(vcs -> vcs.getDisplayName(), String.CASE_INSENSITIVE_ORDER); - public StartUseVcsDialog(@NotNull Project project, @NotNull String targetDirectory) { super(project, true); myTargetDirectory = targetDirectory; AbstractVcs[] vcses = ProjectLevelVcsManager.getInstance(project).getAllSupportedVcss(); - ContainerUtil.sort(vcses, VCS_COMPARATOR); + ContainerUtil.sort(vcses, SuggestedVcsComparator.create(project)); myVcsCombo = new ComboBox<>(vcses); myVcsCombo.setRenderer(SimpleListCellRenderer.create("", AbstractVcs::getDisplayName)); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/SuggestedVcsComparator.kt b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/SuggestedVcsComparator.kt new file mode 100644 index 000000000000..6c8cc0304f21 --- /dev/null +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/SuggestedVcsComparator.kt @@ -0,0 +1,25 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.openapi.vcs.configurable + +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.text.NaturalComparator +import com.intellij.openapi.vcs.AbstractVcs +import com.intellij.openapi.vcs.ProjectLevelVcsManager +import org.jetbrains.annotations.NonNls + +object SuggestedVcsComparator { + private const val GIT_VCS_NAME: @NonNls String = "Git" + + @JvmStatic + fun create(project: Project): Comparator { + val activeVcss = ProjectLevelVcsManager.getInstance(project).getAllActiveVcss(); + return compareBy { vcs -> + when { + vcs == null -> 1 // is last + activeVcss.contains(vcs) -> -2 + vcs.name == GIT_VCS_NAME -> -1 + else -> 0 + } + }.thenComparing({ vcs -> vcs?.displayName ?: "" }, NaturalComparator.INSTANCE) + } +} \ No newline at end of file diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsDirectoryConfigurationPanel.kt b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsDirectoryConfigurationPanel.kt index 88a20f43ad8f..43f903e885f2 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsDirectoryConfigurationPanel.kt +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsDirectoryConfigurationPanel.kt @@ -37,12 +37,12 @@ import java.awt.Component import java.awt.GridBagConstraints import java.awt.GridBagLayout import java.io.File -import java.util.* import javax.swing.JComponent import javax.swing.JPanel import javax.swing.JTable import javax.swing.table.TableCellEditor import javax.swing.table.TableCellRenderer +import kotlin.Throws class VcsDirectoryConfigurationPanel(private val project: Project) : JPanel(), Disposable { private val POSTPONE_MAPPINGS_LOADING_PANEL = ProgressIndicatorWithDelayedPresentation.DEFAULT_PROGRESS_DIALOG_POSTPONE_TIME_MILLIS @@ -151,7 +151,7 @@ class VcsDirectoryConfigurationPanel(private val project: Project) : JPanel(), D initializeModel() - vcsComboBox = buildVcsesComboBox(allSupportedVcss) + vcsComboBox = buildVcsesComboBox(project, allSupportedVcss) vcsComboBox.addItemListener { if (mappingTable.isEditing) { mappingTable.stopEditing() @@ -471,11 +471,11 @@ class VcsDirectoryConfigurationPanel(private val project: Project) : JPanel(), D @JvmStatic fun buildVcsesComboBox(project: Project): ComboBox { val allVcses = ProjectLevelVcsManager.getInstance(project).allSupportedVcss - return buildVcsesComboBox(allVcses.asList()) + return buildVcsesComboBox(project, allVcses.asList()) } - private fun buildVcsesComboBox(allVcses: List): ComboBox { - val comboBox = ComboBox((allVcses + null).toTypedArray()) + private fun buildVcsesComboBox(project: Project, allVcses: List): ComboBox { + val comboBox = ComboBox((allVcses + null).sortedWith(SuggestedVcsComparator.create(project)).toTypedArray()) comboBox.renderer = SimpleListCellRenderer.create(VcsBundle.message("none.vcs.presentation")) { obj: AbstractVcs? -> obj?.displayName } return comboBox } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsMappingConfigurationDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsMappingConfigurationDialog.java index 0aacac88f874..eb6462668d6e 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsMappingConfigurationDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsMappingConfigurationDialog.java @@ -18,6 +18,7 @@ import com.intellij.openapi.vcs.impl.DefaultVcsRootPolicy; import com.intellij.openapi.vcs.impl.VcsDescriptor; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.components.JBLabel; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -67,9 +68,13 @@ public class VcsMappingConfigurationDialog extends DialogWrapper { @NotNull private static VcsDirectoryMapping suggestDefaultMapping(@NotNull Project project) { + AbstractVcs[] vcses = ProjectLevelVcsManager.getInstance(project).getAllSupportedVcss(); + ContainerUtil.sort(vcses, SuggestedVcsComparator.create(project)); + String defaultVcsName = vcses.length > 0 ? vcses[0].getName() : ""; + String basePath = project.getBasePath(); - if (basePath == null) return VcsDirectoryMapping.createDefault(""); - return new VcsDirectoryMapping(basePath, ""); + if (basePath == null) return VcsDirectoryMapping.createDefault(defaultVcsName); + return new VcsDirectoryMapping(basePath, defaultVcsName); } @Override