diff --git a/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.form b/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.form
deleted file mode 100644
index b1a81e8c2a8a..000000000000
--- a/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.form
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
diff --git a/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.java b/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.java
deleted file mode 100644
index ccfd0f588971..000000000000
--- a/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.java
+++ /dev/null
@@ -1,575 +0,0 @@
-/*
- * Copyright 2000-2013 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.configuration;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.intellij.icons.AllIcons;
-import com.intellij.openapi.actionSystem.AnActionEvent;
-import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.options.Configurable;
-import com.intellij.openapi.options.ConfigurationException;
-import com.intellij.openapi.project.DumbAware;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.*;
-import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
-import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.roots.OrderRootType;
-import com.intellij.openapi.roots.ProjectRootManager;
-import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
-import com.intellij.openapi.ui.DialogWrapper;
-import com.intellij.openapi.ui.Splitter;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.remotesdk.RemoteCredentials;
-import com.intellij.ui.*;
-import com.intellij.ui.components.JBList;
-import com.intellij.ui.components.JBTabbedPane;
-import com.intellij.util.Consumer;
-import com.intellij.util.NullableConsumer;
-import com.intellij.util.NullableFunction;
-import com.intellij.util.containers.FactoryMap;
-import com.intellij.webcore.packaging.PackagesNotificationPanel;
-import com.jetbrains.python.packaging.ui.PyInstalledPackagesPanel;
-import com.jetbrains.python.packaging.ui.PyPackageManagementService;
-import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
-import com.jetbrains.python.sdk.*;
-import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
-import icons.PythonIcons;
-import org.jetbrains.annotations.Nullable;
-
-import javax.swing.*;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import java.awt.*;
-import java.util.*;
-import java.util.List;
-
-public class PythonSdkConfigurable implements Configurable, Configurable.NoScroll {
- private JPanel myPanel;
- private JList mySdkList;
- private JPanel mySplitterHolder;
- private PackagesNotificationPanel myNotificationsArea;
- private JPanel myNotificationsPlaceholder;
- private PythonPathEditor myPathEditor;
- private boolean mySdkListChanged = false;
- private Sdk myAddedSdk;
- private final PyConfigurableInterpreterList myInterpreterList;
- private final ProjectSdksModel myProjectSdksModel;
- private final PyInstalledPackagesPanel myPackagesPanel;
-
- private Map myModificators = new FactoryMap() {
- @Override
- protected SdkModificator create(Sdk sdk) {
- return sdk.getSdkModificator();
- }
- };
- private Set myModifiedModificators = new HashSet();
- private Sdk myPreviousSelection;
- private boolean myFirstReset;
- private final Project myProject;
-
- private boolean myNewProject = false;
- private boolean myShowOtherProjectVirtualenvs = false;
-
- public void setNewProject(final boolean newProject) {
- myNewProject = newProject;
- }
-
- public PythonSdkConfigurable(Project project) {
- myProject = project;
- myInterpreterList = PyConfigurableInterpreterList.getInstance(myProject);
- myProjectSdksModel = myInterpreterList.getModel();
- myFirstReset = true;
-
-
- mySdkList = new JBList();
- mySdkList.setCellRenderer(new PySdkListCellRenderer("", myModificators));
- mySdkList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-
- ToolbarDecorator decorator = ToolbarDecorator.createDecorator(mySdkList).disableUpDownActions()
- .setAddAction(new AnActionButtonRunnable() {
- @Override
- public void run(AnActionButton button) {
- addSdk(button);
- }
- })
- .setEditAction(new AnActionButtonRunnable() {
- @Override
- public void run(AnActionButton button) {
- editSdk();
- }
- })
- .setRemoveAction(new AnActionButtonRunnable() {
- @Override
- public void run(AnActionButton button) {
- removeSdk();
- }
- })
- .addExtraAction(new CreateVirtualEnvButton())
- .addExtraAction(new ToggleVirtualEnvFilterButton());
-
-
- final Splitter splitter = new Splitter(true);
- /*
- final JScrollPane sdkListPane = ScrollPaneFactory.createScrollPane(mySdkList,
- ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
- sdkListPane.setPreferredSize(new Dimension(10, 10));
- */
- splitter.setFirstComponent(decorator.createPanel());
-
- myPathEditor =
- new PythonPathEditor("Classes", OrderRootType.CLASSES, FileChooserDescriptorFactory.createAllButJarContentsDescriptor()) {
- @Override
- protected void onReloadButtonClicked() {
- reloadSdk();
- }
- };
-
- myNotificationsArea = new PackagesNotificationPanel(project);
- myNotificationsPlaceholder.add(myNotificationsArea.getComponent(), BorderLayout.CENTER);
-
- final JBTabbedPane tabbedPane = new JBTabbedPane(SwingConstants.TOP);
- myPackagesPanel = new PyInstalledPackagesPanel(project, myNotificationsArea);
- tabbedPane.addTab("Packages", myPackagesPanel);
-
- JPanel panel1 = new JPanel(new GridBagLayout());
- Insets anInsets1 = new Insets(2, 2, 2, 2);
- JScrollPane scrollPane1 = ScrollPaneFactory.createScrollPane(myPathEditor.createComponent(),
- ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
- scrollPane1.setPreferredSize(new Dimension(500, 500));
- panel1.add(scrollPane1, new GridBagConstraints(0, 0, 1, 8, 1.0, 1.0,
- GridBagConstraints.CENTER,
- GridBagConstraints.BOTH,
- anInsets1, 0, 0));
-
- tabbedPane.addTab("Paths", panel1);
-
- splitter.setSecondComponent(tabbedPane);
- mySplitterHolder.add(splitter, BorderLayout.CENTER);
-
- addListeners();
- }
-
- private void addListeners() {
- myProjectSdksModel.addListener(new SdkModel.Listener() {
- @Override
- public void sdkAdded(Sdk sdk) {
- }
-
- @Override
- public void beforeSdkRemove(Sdk sdk) {
- }
-
- @Override
- public void sdkChanged(Sdk sdk, String previousName) {
- refreshSdkList();
- }
-
- @Override
- public void sdkHomeSelected(Sdk sdk, String newSdkHome) {
- }
- });
- myPackagesPanel.addPathChangedListener(new Consumer() {
- @Override
- public void consume(Sdk sdk) {
- updateSdkPaths(sdk);
- }
- });
-
- myNotificationsArea.addLinkHandler(PyInstalledPackagesPanel.CREATE_VENV, new Runnable() {
- @Override
- public void run() {
- createVirtualEnv(getSelectedSdk());
- }
- });
- mySdkList.addListSelectionListener(new ListSelectionListener() {
- public void valueChanged(ListSelectionEvent event) {
- updateUI(getSelectedSdk());
- }
- });
- }
-
- private void updateUI(final Sdk selectedSdk) {
- if (myPreviousSelection != null) {
- saveSdkPaths(myPreviousSelection);
- }
- myProjectSdksModel.setProjectSdk(selectedSdk);
- updateSdkPaths(selectedSdk);
- myPreviousSelection = selectedSdk;
- myPackagesPanel.updatePackages(selectedSdk == null ? null : new PyPackageManagementService(myProject, selectedSdk));
-
- if (selectedSdk != null) {
- myPackagesPanel.updateNotifications(selectedSdk);
- }
- }
-
- private void createVirtualEnv(Sdk sdk) {
- CreateVirtualEnvDialog.VirtualEnvCallback callback = new CreateVirtualEnvDialog.VirtualEnvCallback() {
- @Override
- public void virtualEnvCreated(Sdk sdk, boolean associateWithProject) {
- PythonSdkType.setupSdkPaths(sdk, myProject, null);
- if (associateWithProject) {
- SdkAdditionalData additionalData = sdk.getSdkAdditionalData();
- if (additionalData == null) {
- additionalData = new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(sdk.getHomePath()));
- ((ProjectJdkImpl)sdk).setSdkAdditionalData(additionalData);
- }
- if (myNewProject) {
- ((PythonSdkAdditionalData)additionalData).associateWithNewProject();
- }
- else {
- ((PythonSdkAdditionalData)additionalData).associateWithProject(myProject);
- }
- }
- addCreatedSdk(sdk, true);
- }
- };
- final List allSdks = PyConfigurableInterpreterList.getInstance(myProject).getAllPythonSdks(myProject);
- final CreateVirtualEnvDialog dialog = new CreateVirtualEnvDialog(myProject, allSdks, sdk);
- dialog.show();
- if (dialog.isOK()) {
- dialog.createVirtualEnv(allSdks, callback);
- }
- }
-
- public String getDisplayName() {
- return "Python Interpreters";
- }
-
- public String getHelpTopic() {
- return "python_interpreter";
- }
-
- public JComponent createComponent() {
- return myPanel;
- }
-
- public boolean isModified() {
- return mySdkListChanged ||
- myProjectSdksModel.isModified() ||
- myPathEditor.isModified() ||
- !myModifiedModificators.isEmpty();
- }
-
- @Nullable
- private String getSelectedSdkName() {
- final Sdk selectedSdk = (Sdk)mySdkList.getSelectedValue();
- return selectedSdk == null ? null : selectedSdk.getName();
- }
-
- public void apply() throws ConfigurationException {
- if (myPreviousSelection != null) {
- saveSdkPaths(myPreviousSelection);
- }
- for (SdkModificator modificator : myModifiedModificators) {
- modificator.commitChanges();
- }
- myModificators.clear();
- myModifiedModificators.clear();
- myProjectSdksModel.apply();
- mySdkListChanged = false;
- SdkConfigurationUtil.setDirectoryProjectSdk(myProject, myAddedSdk);
- myProjectSdksModel.setProjectSdk(myAddedSdk);
- myInterpreterList.setSelectedSdk(myAddedSdk);
- }
-
- /**
- * Returns the stable copy of the SDK currently selected in the SDK table.
- *
- * @return the selected SDK, or null if there's no selection
- */
- @Nullable
- public Sdk getRealSelectedSdk() {
- return ProjectJdkTable.getInstance().findJdk(getSelectedSdkName());
- }
-
- @Nullable
- public Sdk getSelectedSdk() {
- return (Sdk)mySdkList.getSelectedValue();
- }
-
- public void reset() {
- clearModificators();
- if (myFirstReset) {
- myFirstReset = false;
- }
- else {
- myProjectSdksModel.reset(null);
- }
- refreshSdkList();
- final Sdk selectedSdk = getRealSelectedSdk();
- if (selectedSdk != null) {
- myPackagesPanel.updateNotifications(selectedSdk);
- }
- }
-
- private void clearModificators() {
- myModificators.clear();
- myModifiedModificators.clear();
- myPreviousSelection = null;
- }
-
- private void refreshSdkList() {
- final List pythonSdks = myInterpreterList.getAllPythonSdks(myProject);
- Sdk projectSdk = myProjectSdksModel.getProjectSdk();
- if (!myShowOtherProjectVirtualenvs) {
- VirtualEnvProjectFilter.removeNotMatching(myProject, pythonSdks);
- }
- Collections.sort(pythonSdks, new PreferredSdkComparator());
- mySdkList.setModel(new CollectionListModel(pythonSdks));
-
- mySdkListChanged = false;
- if (projectSdk == null) projectSdk = getSdk();
- if (projectSdk != null) {
- projectSdk = myProjectSdksModel.findSdk(projectSdk.getName());
- mySdkList.clearSelection();
- mySdkList.setSelectedValue(projectSdk, true);
- mySdkList.updateUI();
- }
- }
-
- @Nullable
- private Sdk getSdk() {
- final Module[] modules = ModuleManager.getInstance(myProject).getModules();
- if (modules.length > 0) {
- final Module module = modules[0];
- final ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
- return rootManager.getSdk();
- }
- return ProjectRootManager.getInstance(myProject).getProjectSdk();
- }
-
- private void addSdk(AnActionButton button) {
- PythonSdkDetailsStep
- .show(myProject, myProjectSdksModel.getSdks(), new PythonSdkDetailsDialog(myProject, null), button.getPreferredPopupPoint(), false,
- new NullableConsumer() {
- @Override
- public void consume(Sdk sdk) {
- addCreatedSdk(sdk, false);
- }
- });
- }
-
- private void addCreatedSdk(@Nullable final Sdk sdk, boolean newVirtualEnv) {
- if (sdk != null) {
- myAddedSdk = sdk;
- boolean isVirtualEnv = PythonSdkType.isVirtualEnv(sdk);
- if (isVirtualEnv && !newVirtualEnv) {
- AddVEnvOptionsDialog dialog = new AddVEnvOptionsDialog(myPanel);
- dialog.show();
- if (dialog.getExitCode() != DialogWrapper.OK_EXIT_CODE) {
- return;
- }
- SdkModificator modificator = myModificators.get(sdk);
- setSdkAssociated(modificator, !dialog.makeAvailableToAll());
- myModifiedModificators.add(modificator);
- }
- myProjectSdksModel.addSdk(sdk);
- refreshSdkList();
- mySdkList.setSelectedValue(sdk, true);
- mySdkListChanged = true;
- }
- }
-
- private void editSdk() {
- final Sdk currentSdk = getSelectedSdk();
- if (currentSdk != null) {
- if (currentSdk.getSdkAdditionalData() instanceof RemoteCredentials) {
- editRemoteSdk(currentSdk);
- }
- else {
- editSdk(currentSdk);
- }
- updateUI(currentSdk);
- }
- }
-
- private void editRemoteSdk(Sdk currentSdk) {
- PythonRemoteInterpreterManager remoteInterpreterManager = PythonRemoteInterpreterManager.getInstance();
- if (remoteInterpreterManager != null) {
- final SdkModificator modificator = myModificators.get(currentSdk);
- Set existingSdks = Sets.newHashSet(myProjectSdksModel.getSdks());
- existingSdks.remove(currentSdk);
- if (remoteInterpreterManager.editSdk(myProject, modificator, existingSdks)) {
- myModifiedModificators.add(modificator);
- }
- }
- }
-
- private void editSdk(final Sdk currentSdk) {
- final SdkModificator modificator = myModificators.get(currentSdk);
- final EditSdkDialog dialog = new EditSdkDialog(myProject, modificator, new NullableFunction() {
- @Override
- public String fun(String s) {
- if (isDuplicateSdkName(s, currentSdk)) {
- return "Please specify a unique name for the interpreter";
- }
- return null;
- }
- });
- dialog.show();
- if (dialog.isOK()) {
- final boolean pathChanged = !Comparing.equal(currentSdk.getHomePath(), dialog.getHomePath());
- if (!currentSdk.getName().equals(dialog.getName()) || pathChanged || dialog.isAssociateChanged()) {
- myModifiedModificators.add(modificator);
- modificator.setName(dialog.getName());
- modificator.setHomePath(dialog.getHomePath());
-
- if (dialog.isAssociateChanged()) {
- setSdkAssociated(modificator, dialog.associateWithProject());
- }
- if (pathChanged) {
- reloadSdk(currentSdk);
- }
- }
- }
- }
-
- private void setSdkAssociated(SdkModificator modificator, boolean isAssociated) {
- PythonSdkAdditionalData additionalData = (PythonSdkAdditionalData)modificator.getSdkAdditionalData();
- if (additionalData == null) {
- additionalData = new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(modificator.getHomePath()));
- modificator.setSdkAdditionalData(additionalData);
- }
- if (isAssociated) {
- additionalData.associateWithProject(myProject);
- }
- else {
- additionalData.setAssociatedProjectPath(null);
- }
- }
-
- private boolean isDuplicateSdkName(String s, Sdk sdk) {
- for (Sdk existingSdk : myProjectSdksModel.getSdks()) {
- if (existingSdk == sdk) {
- continue;
- }
- String existingName;
- if (myModificators.containsKey(existingSdk)) {
- existingName = myModificators.get(existingSdk).getName();
- }
- else {
- existingName = existingSdk.getName();
- }
- if (existingName.equals(s)) {
- return true;
- }
- }
- return false;
- }
-
- private void removeSdk() {
- final Sdk current_sdk = getSelectedSdk();
- if (current_sdk != null) {
- myProjectSdksModel.removeSdk(current_sdk);
- if (myModificators.containsKey(current_sdk)) {
- SdkModificator modificator = myModificators.get(current_sdk);
- myModifiedModificators.remove(modificator);
- myModificators.remove(current_sdk);
- }
- refreshSdkList();
- mySdkListChanged = true;
- // TODO select initially selected SDK
- if (mySdkList.getSelectedIndex() < 0) {
- mySdkList.setSelectedIndex(0);
- }
- }
- }
-
- private void reloadSdk() {
- final Sdk currentSdk = getSelectedSdk();
- if (currentSdk != null) {
- myModifiedModificators.add(myModificators.get(currentSdk));
- reloadSdk(currentSdk);
- }
- }
-
- private void reloadSdk(Sdk currentSdk) {
- PythonSdkType.setupSdkPaths(myProject, null, currentSdk, myModificators.get(currentSdk)); // or must it be a RunWriteAction?
- reloadSdkPaths(currentSdk);
- }
-
- public void disposeUIResources() {
- myInterpreterList.disposeModel();
- clearModificators();
- myFirstReset = true;
- }
-
- private void saveSdkPaths(Sdk selection) {
- SdkModificator modificator = myModificators.get(selection);
- if (myPathEditor.isModified()) {
- myPathEditor.apply(modificator);
- myModifiedModificators.add(modificator);
- }
- }
-
- private void reloadSdkPaths(Sdk selection) {
- List rootPaths = Lists.newArrayList();
- if (selection != null) {
- Collections.addAll(rootPaths, selection.getRootProvider().getFiles(OrderRootType.CLASSES));
- myPathEditor.reload(myModificators.get(selection));
- }
- else {
- myPathEditor.reload(null);
- }
- }
-
- private void updateSdkPaths(final Sdk selection) {
- final List rootPaths = Lists.newArrayList();
- if (selection != null) {
- Collections.addAll(rootPaths, selection.getRootProvider().getFiles(OrderRootType.CLASSES));
- myPathEditor.reset(myModificators.get(selection));
- }
- else {
- myPathEditor.reset(null);
- }
- }
-
- private class CreateVirtualEnvButton extends AnActionButton implements DumbAware {
- public CreateVirtualEnvButton() {
- super("Create Virtual Environment", PythonIcons.Python.Virtualenv);
- }
-
- @Override
- public void actionPerformed(AnActionEvent e) {
- Sdk selectedSdk = getSelectedSdk();
- createVirtualEnv(selectedSdk);
- }
- }
-
- private class ToggleVirtualEnvFilterButton extends ToggleActionButton implements DumbAware {
- public ToggleVirtualEnvFilterButton() {
- super("Show virtual environments associated with other projects", AllIcons.General.Filter);
- }
-
- @Override
- public boolean isSelected(AnActionEvent e) {
- return myShowOtherProjectVirtualenvs;
- }
-
- @Override
- public void setSelected(AnActionEvent e, boolean state) {
- myShowOtherProjectVirtualenvs = state;
- refreshSdkList();
- }
- }
-}
diff --git a/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectAction.java b/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectAction.java
index 4496b6d4d854..4d638eee4101 100644
--- a/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectAction.java
+++ b/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectAction.java
@@ -27,6 +27,7 @@ import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.platform.DirectoryProjectGenerator;
import com.intellij.platform.NewDirectoryProjectAction;
+import com.jetbrains.python.sdk.PyDetectedSdk;
import com.jetbrains.python.sdk.PythonSdkAdditionalData;
import com.jetbrains.python.sdk.PythonSdkType;
@@ -48,6 +49,9 @@ public class PythonNewDirectoryProjectAction extends NewDirectoryProjectAction {
dlg.show();
if (dlg.getExitCode() != DialogWrapper.OK_EXIT_CODE) return;
mySdk = dlg.getSdk();
+ if (mySdk instanceof PyDetectedSdk) {
+ mySdk = SdkConfigurationUtil.createAndAddSDK(mySdk.getName(), PythonSdkType.getInstance());
+ }
myInstallFramework = dlg.installFramework();
Project newProject = generateProject(project, dlg);
if (newProject != null) {
diff --git a/python/src/META-INF/pycharm-core.xml b/python/src/META-INF/pycharm-core.xml
index 7a4a9c694cda..0c1457d48049 100644
--- a/python/src/META-INF/pycharm-core.xml
+++ b/python/src/META-INF/pycharm-core.xml
@@ -31,7 +31,6 @@
-