Disabled ability to remove detected Python interpreter (PY-13708)

The list of removed interpreters that were detected at the same time was
confusing to users since its state was hidden with no ability to revert
an interpreter to become detected, but not added.
This commit is contained in:
Andrey Vlasovskikh
2016-08-17 21:05:30 +03:00
parent d486e40723
commit 6f36a417e8
9 changed files with 5 additions and 116 deletions
@@ -27,7 +27,6 @@ import com.intellij.ui.ComboboxWithBrowseButton;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.configuration.PyConfigurableInterpreterList;
import com.jetbrains.python.sdk.PySdkListCellRenderer;
import com.jetbrains.python.sdk.PySdkService;
import com.jetbrains.python.sdk.PythonSdkDetailsStep;
import javax.swing.*;
@@ -77,9 +76,6 @@ public class PythonSdkChooserCombo extends ComboboxWithBrowseButton {
final Sdk oldSelectedSdk = (Sdk)comboBox.getSelectedItem();
PythonSdkDetailsStep.show(project, sdks, null, this, getButton().getLocationOnScreen(), sdk -> {
if (sdk == null) return;
final PySdkService sdkService = PySdkService.getInstance();
sdkService.restoreSdk(sdk);
final ProjectSdksModel projectSdksModel = interpreterList.getModel();
if (projectSdksModel.findSdk(sdk) == null) {
projectSdksModel.addSdk(sdk);
@@ -116,7 +116,6 @@ public class PythonGenerateProjectCallback implements NullableConsumer<ProjectSe
return LocalFileSystem.getInstance().refreshAndFindFileByPath(name);
}
});
PySdkService.getInstance().solidifySdk(sdk);
sdk = SdkConfigurationUtil.createAndAddSDK(sdkHome.getPath(), PythonSdkType.getInstance());
if (sdk != null) {
PythonSdkUpdater.updateOrShowError(sdk, null, project, null);
@@ -270,7 +270,6 @@ public class PyActiveSdkConfigurable implements UnnamedConfigurable {
updateSdkList(false);
myProjectSdksModel.apply();
setSelectedSdk(selectedSdk);
PySdkService.getInstance().solidifySdk(selectedSdk);
}
final Sdk prevSdk = getSdk();
@@ -396,8 +395,6 @@ public class PyActiveSdkConfigurable implements UnnamedConfigurable {
@Override
public void consume(Sdk sdk) {
if (sdk == null) return;
final PySdkService sdkService = PySdkService.getInstance();
sdkService.restoreSdk(sdk);
if (!(sdk instanceof PyDetectedSdk) && myProjectSdksModel.findSdk(sdk.getName()) == null) {
myProjectSdksModel.addSdk(sdk);
@@ -15,8 +15,6 @@
*/
package com.jetbrains.python.configuration;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
@@ -24,7 +22,10 @@ import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
import com.intellij.openapi.util.Comparing;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.sdk.*;
import com.jetbrains.python.sdk.PyDetectedSdk;
import com.jetbrains.python.sdk.PySdkUtil;
import com.jetbrains.python.sdk.PythonSdkAdditionalData;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import com.jetbrains.python.sdk.flavors.VirtualEnvSdkFlavor;
import org.jetbrains.annotations.NotNull;
@@ -76,7 +77,6 @@ public class PyConfigurableInterpreterList {
}
private void addDetectedSdks(@NotNull final List<Sdk> result) {
final PySdkService sdkService = PySdkService.getInstance();
final List<String> sdkHomes = new ArrayList<>();
sdkHomes.addAll(VirtualEnvSdkFlavor.INSTANCE.suggestHomePaths());
for (PythonSdkFlavor flavor : PythonSdkFlavor.getApplicableFlavors()) {
@@ -84,16 +84,9 @@ public class PyConfigurableInterpreterList {
sdkHomes.addAll(flavor.suggestHomePaths());
}
Collections.sort(sdkHomes);
sdkHomes.addAll(sdkService.getAddedSdks());
for (String sdkHome : SdkConfigurationUtil.filterExistingPaths(PythonSdkType.getInstance(), sdkHomes, getModel().getSdks())) {
result.add(new PyDetectedSdk(sdkHome));
}
Iterables.removeIf(result, new Predicate<Sdk>() {
@Override
public boolean apply(@Nullable Sdk input) {
return input != null && sdkService.isRemoved(input);
}
});
}
public List<Sdk> getAllPythonSdks() {
@@ -154,6 +154,7 @@ public class PythonSdkDetailsDialog extends DialogWrapper {
updateOkButton();
}
})
.setRemoveActionUpdater(e -> !(getSelectedSdk() instanceof PyDetectedSdk))
.addExtraAction(new ToggleVirtualEnvFilterButton())
.addExtraAction(new ShowPathButton());
@@ -279,9 +280,6 @@ public class PythonSdkDetailsDialog extends DialogWrapper {
private void addCreatedSdk(@Nullable final Sdk sdk, boolean newVirtualEnv) {
if (sdk != null) {
final PySdkService sdkService = PySdkService.getInstance();
sdkService.restoreSdk(sdk);
boolean isVirtualEnv = PythonSdkType.isVirtualEnv(sdk);
if (isVirtualEnv && !newVirtualEnv) {
AddVEnvOptionsDialog dialog = new AddVEnvOptionsDialog(myMainPanel);
@@ -390,8 +388,6 @@ public class PythonSdkDetailsDialog extends DialogWrapper {
final Sdk currentSdk = getSelectedSdk();
if (currentSdk != null) {
final Sdk sdk = myProjectSdksModel.findSdk(currentSdk);
final PySdkService sdkService = PySdkService.getInstance();
sdkService.removeSdk(currentSdk);
DumbService.allowStartingDumbModeInside(DumbModePermission.MAY_START_MODAL, () -> SdkConfigurationUtil.removeSdk(sdk));
myProjectSdksModel.removeSdk(sdk);
@@ -428,8 +428,6 @@
serviceImplementation="com.jetbrains.python.codeInsight.PyCodeInsightSettings"/>
<applicationService serviceInterface="com.jetbrains.python.testing.PyTestFrameworkService"
serviceImplementation="com.jetbrains.python.testing.PyTestFrameworkService"/>
<applicationService serviceInterface="com.jetbrains.python.sdk.PySdkService"
serviceImplementation="com.jetbrains.python.sdk.PySdkService"/>
<autoImportOptionsProvider instance="com.jetbrains.python.codeInsight.imports.PyAutoImportOptions"/>
<completion.contributor language="Python"
@@ -139,8 +139,6 @@ public class CreateVirtualEnvDialog extends AbstractCreateVirtualEnvDialog {
myMainPanel.add(myMakeAvailableToAllProjectsCheckbox, c);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final PySdkService sdkService = PySdkService.getInstance();
final PythonSdkType sdkType = PythonSdkType.getInstance();
final FileChooserDescriptor descriptor = sdkType.getHomeChooserDescriptor();
@@ -152,7 +150,6 @@ public class CreateVirtualEnvDialog extends AbstractCreateVirtualEnvDialog {
if (sdk == null) return;
if (!allSdks.contains(sdk)) {
allSdks.add(sdk);
sdkService.addSdk(sdk);
}
updateSdkList(allSdks, sdk);
};
@@ -1,82 +0,0 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jetbrains.python.sdk;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.util.xmlb.XmlSerializerUtil;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.Set;
@State(name = "PySdkService", storages = @Storage("removedInterpreters.xml"))
public class PySdkService implements PersistentStateComponent<PySdkService> {
public static PySdkService getInstance() {
return ServiceManager.getService(PySdkService.class);
}
public Set<String> REMOVED_SDKS = new HashSet<>();
public Set<String> ADDED_SDKS = new HashSet<>();
public void removeSdk(@NotNull final Sdk sdk) {
final String homePath = sdk.getHomePath();
if (ADDED_SDKS.contains(homePath))
ADDED_SDKS.remove(homePath);
REMOVED_SDKS.add(homePath);
}
public void addSdk(@NotNull final Sdk sdk) {
ADDED_SDKS.add(sdk.getHomePath());
}
public Set<String> getAddedSdks() {
return ADDED_SDKS;
}
public void restoreSdk(@NotNull final Sdk sdk) {
final String homePath = sdk.getHomePath();
if (REMOVED_SDKS.contains(homePath)) {
REMOVED_SDKS.remove(homePath);
}
}
public boolean isRemoved(@NotNull final Sdk sdk) {
final String homePath = sdk.getHomePath();
return REMOVED_SDKS.contains(homePath);
}
public void solidifySdk(@NotNull final Sdk sdk) {
final String homePath = sdk.getHomePath();
if (ADDED_SDKS.contains(homePath)) {
ADDED_SDKS.remove(homePath);
}
}
@Override
public PySdkService getState() {
return this;
}
@Override
public void loadState(PySdkService state) {
XmlSerializerUtil.copyBean(state, this);
}
}
@@ -45,7 +45,6 @@ import java.awt.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
public class PythonSdkDetailsStep extends BaseListPopupStep<String> {
@Nullable private DialogWrapper myMore;
@@ -174,10 +173,6 @@ public class PythonSdkDetailsStep extends BaseListPopupStep<String> {
allSdks.add(new PyDetectedSdk(string));
}
}
final Set<String> sdks = PySdkService.getInstance().getAddedSdks();
for (String string : SdkConfigurationUtil.filterExistingPaths(PythonSdkType.getInstance(), sdks, myExistingSdks)) {
allSdks.add(new PyDetectedSdk(string));
}
if (myProject != null) {
dialog = new CreateVirtualEnvDialog(myProject, allSdks);
}