diff options
Diffstat (limited to 'python/ide/src/com/jetbrains/python/newProject/actions')
6 files changed, 189 insertions, 162 deletions
diff --git a/python/ide/src/com/jetbrains/python/newProject/actions/AbstractProjectSettingsStep.java b/python/ide/src/com/jetbrains/python/newProject/actions/AbstractProjectSettingsStep.java index dd68cdb6ed2f..1ad9cf7ececc 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/AbstractProjectSettingsStep.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/AbstractProjectSettingsStep.java @@ -61,6 +61,7 @@ import java.util.List; abstract public class AbstractProjectSettingsStep extends AbstractActionWithPanel implements DumbAware { protected final DirectoryProjectGenerator myProjectGenerator; private final NullableConsumer<AbstractProjectSettingsStep> myCallback; + private final boolean myIsWelcomeScreen; private PythonSdkChooserCombo mySdkCombo; private boolean myInstallFramework; private TextFieldWithBrowseButton myLocationField; @@ -70,10 +71,13 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane private AnAction myCreateAction; private Sdk mySdk; - public AbstractProjectSettingsStep(DirectoryProjectGenerator projectGenerator, NullableConsumer<AbstractProjectSettingsStep> callback) { + public AbstractProjectSettingsStep(DirectoryProjectGenerator projectGenerator, + NullableConsumer<AbstractProjectSettingsStep> callback, + boolean isWelcomeScreen) { super(); myProjectGenerator = projectGenerator; myCallback = callback; + myIsWelcomeScreen = isWelcomeScreen; myProjectDirectory = FileUtil.findSequentNonexistentFile(new File(ProjectUtil.getBaseDir()), "untitled", ""); if (myProjectGenerator instanceof WebProjectTemplate) { ((WebProjectTemplate)myProjectGenerator).getPeer().addSettingsStateListener(new WebProjectGenerator.SettingsStateListener() { @@ -109,17 +113,12 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane @Override public JPanel createPanel() { final JPanel basePanel = createBasePanel(); - final JPanel mainPanel = new JPanel(new BorderLayout()) { - @Override - protected void paintComponent(Graphics g) { - myLocationField.requestFocus(); - } - }; + final JPanel mainPanel = new JPanel(new BorderLayout()); final JPanel scrollPanel = new JPanel(new BorderLayout()); final DirectoryProjectGenerator[] generators = Extensions.getExtensions(DirectoryProjectGenerator.EP_NAME); - final int height = generators.length == 0 ? 150 : 400; + final int height = generators.length == 0 && !myIsWelcomeScreen ? 150 : 400; mainPanel.setPreferredSize(new Dimension(mainPanel.getPreferredSize().width, height)); myErrorLabel = new JLabel(""); myErrorLabel.setForeground(JBColor.RED); @@ -273,6 +272,7 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane } public boolean checkValid() { + if (myLocationField == null) return true; final String projectName = myLocationField.getText(); setErrorText(null); myInstallFramework = false; @@ -367,22 +367,6 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane myErrorLabel.setForeground(MessageType.WARNING.getTitleForeground()); } - public void selectCompatiblePython() { - //DirectoryProjectGenerator generator = getProjectGenerator(); - //if (generator instanceof PyFrameworkProjectGenerator && !((PyFrameworkProjectGenerator)generator).supportsPython3()) { - // Sdk sdk = getSdk(); - // if (sdk != null && PythonSdkType.getLanguageLevelForSdk(sdk).isPy3K()) { - // Sdk python2Sdk = PythonSdkType.findPython2Sdk(null); - // if (python2Sdk != null) { - // mySdkCombo.getComboBox().setSelectedItem(python2Sdk); - // mySdkCombo.getComboBox().revalidate(); - // mySdkCombo.getComboBox().repaint(); - // - // } - // } - //} - } - private static boolean acceptsRemoteSdk(DirectoryProjectGenerator generator) { if (generator instanceof PyFrameworkProjectGenerator) { return ((PyFrameworkProjectGenerator)generator).acceptsRemoteSdk(); diff --git a/python/ide/src/com/jetbrains/python/newProject/actions/GenerateProjectCallback.java b/python/ide/src/com/jetbrains/python/newProject/actions/GenerateProjectCallback.java new file mode 100644 index 000000000000..2aa9a391512f --- /dev/null +++ b/python/ide/src/com/jetbrains/python/newProject/actions/GenerateProjectCallback.java @@ -0,0 +1,159 @@ +/* + * 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.newProject.actions; + +import com.intellij.ide.GeneralSettings; +import com.intellij.ide.util.projectWizard.WebProjectTemplate; +import com.intellij.internal.statistic.UsageTrigger; +import com.intellij.internal.statistic.beans.ConvertUsagesUtil; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.projectRoots.ProjectJdkTable; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.SdkAdditionalData; +import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil; +import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Computable; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.platform.DirectoryProjectGenerator; +import com.intellij.platform.PlatformProjectOpenProcessor; +import com.intellij.projectImport.ProjectOpenedCallback; +import com.intellij.util.NullableConsumer; +import com.jetbrains.python.configuration.PyConfigurableInterpreterList; +import com.jetbrains.python.newProject.PyNewProjectSettings; +import com.jetbrains.python.newProject.PythonProjectGenerator; +import com.jetbrains.python.sdk.PyDetectedSdk; +import com.jetbrains.python.sdk.PySdkService; +import com.jetbrains.python.sdk.PythonSdkAdditionalData; +import com.jetbrains.python.sdk.PythonSdkType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.List; + +public class GenerateProjectCallback implements NullableConsumer<AbstractProjectSettingsStep> { + private static final Logger LOG = Logger.getInstance(GenerateProjectCallback.class); + @Nullable private final Runnable myRunnable; + + public GenerateProjectCallback(@Nullable final Runnable runnable) { + + myRunnable = runnable; + } + + @Override + public void consume(@Nullable AbstractProjectSettingsStep settingsStep) { + if (myRunnable != null) { + myRunnable.run(); + } + if (settingsStep == null) return; + + Sdk sdk = settingsStep.getSdk(); + final Project project = ProjectManager.getInstance().getDefaultProject(); + final ProjectSdksModel model = PyConfigurableInterpreterList.getInstance(project).getModel(); + if (sdk instanceof PyDetectedSdk) { + final String name = sdk.getName(); + VirtualFile sdkHome = ApplicationManager.getApplication().runWriteAction(new Computable<VirtualFile>() { + @Override + public VirtualFile compute() { + return LocalFileSystem.getInstance().refreshAndFindFileByPath(name); + } + }); + PySdkService.getInstance().solidifySdk(sdk); + sdk = SdkConfigurationUtil.setupSdk(ProjectJdkTable.getInstance().getAllJdks(), sdkHome, PythonSdkType.getInstance(), true, null, + null); + model.addSdk(sdk); + settingsStep.setSdk(sdk); + try { + model.apply(); + } + catch (ConfigurationException exception) { + LOG.error("Error adding detected python interpreter " + exception.getMessage()); + } + } + Project newProject = generateProject(project, settingsStep); + if (newProject != null) { + SdkConfigurationUtil.setDirectoryProjectSdk(newProject, sdk); + final List<Sdk> sdks = PythonSdkType.getAllSdks(); + for (Sdk s : sdks) { + final SdkAdditionalData additionalData = s.getSdkAdditionalData(); + if (additionalData instanceof PythonSdkAdditionalData) { + ((PythonSdkAdditionalData)additionalData).reassociateWithCreatedProject(newProject); + } + } + } + } + + @Nullable + private Project generateProject(@NotNull final Project project, @NotNull final AbstractProjectSettingsStep settings) { + final DirectoryProjectGenerator generator = settings.getProjectGenerator(); + final File location = new File(settings.getProjectLocation()); + if (!location.exists() && !location.mkdirs()) { + Messages.showErrorDialog(project, "Cannot create directory '" + location + "'", "Create Project"); + return null; + } + + final VirtualFile baseDir = ApplicationManager.getApplication().runWriteAction(new Computable<VirtualFile>() { + public VirtualFile compute() { + return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(location); + } + }); + LOG.assertTrue(baseDir != null, "Couldn't find '" + location + "' in VFS"); + baseDir.refresh(false, true); + + if (baseDir.getChildren().length > 0) { + int rc = Messages.showYesNoDialog(project, + "The directory '" + location + + "' is not empty. Would you like to create a project from existing sources instead?", + "Create New Project", Messages.getQuestionIcon()); + if (rc == Messages.YES) { + return PlatformProjectOpenProcessor.getInstance().doOpenProject(baseDir, null, false); + } + } + + String generatorName = generator == null ? "empty" : ConvertUsagesUtil.ensureProperKey(generator.getName()); + UsageTrigger.trigger("NewDirectoryProjectAction." + generatorName); + + GeneralSettings.getInstance().setLastProjectCreationLocation(location.getParent()); + + return PlatformProjectOpenProcessor.doOpenProject(baseDir, null, false, -1, new ProjectOpenedCallback() { + @Override + public void projectOpened(Project project, Module module) { + if (generator != null) { + Object projectSettings = null; + if (generator instanceof PythonProjectGenerator) { + projectSettings = ((PythonProjectGenerator)generator).getProjectSettings(); + } + else if (generator instanceof WebProjectTemplate) { + projectSettings = ((WebProjectTemplate)generator).getPeer().getSettings(); + } + if (projectSettings instanceof PyNewProjectSettings) { + ((PyNewProjectSettings)projectSettings).setSdk(settings.getSdk()); + ((PyNewProjectSettings)projectSettings).setInstallFramework(settings.installFramework()); + } + //noinspection unchecked + generator.generateProject(project, baseDir, projectSettings, module); + } + } + }, false); + } +} diff --git a/python/ide/src/com/jetbrains/python/newProject/actions/PluginSpecificProjectsStep.java b/python/ide/src/com/jetbrains/python/newProject/actions/PluginSpecificProjectsStep.java index a0c5f6e52fbf..ca0f3608a5d9 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/PluginSpecificProjectsStep.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/PluginSpecificProjectsStep.java @@ -27,11 +27,11 @@ import java.util.List; public class PluginSpecificProjectsStep extends DefaultActionGroup implements DumbAware { public PluginSpecificProjectsStep(@NotNull final NullableConsumer<AbstractProjectSettingsStep> callback, - @NotNull final List<DirectoryProjectGenerator> projectGenerators) { + @NotNull final List<DirectoryProjectGenerator> projectGenerators, boolean isWelcomeScreen) { super("Plugin-specific", true); getTemplatePresentation().setIcon(AllIcons.Nodes.PluginLogo); for (DirectoryProjectGenerator generator : projectGenerators) { - add(new ProjectSpecificAction(callback, generator)); + add(new ProjectSpecificAction(callback, generator, isWelcomeScreen)); } } } diff --git a/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificAction.java b/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificAction.java index 4397a090b253..fbb65f0fbe9e 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificAction.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificAction.java @@ -28,10 +28,16 @@ public class ProjectSpecificAction extends DefaultActionGroup implements DumbAwa private final ProjectSpecificSettingsStep mySettings; public ProjectSpecificAction(@NotNull final NullableConsumer<AbstractProjectSettingsStep> callback, - @NotNull final DirectoryProjectGenerator projectGenerator) { - super(projectGenerator.getName(), true); + @NotNull final DirectoryProjectGenerator projectGenerator, boolean isWelcomeScreen) { + this(callback, projectGenerator, projectGenerator.getName(), isWelcomeScreen); + } + + public ProjectSpecificAction(@NotNull final NullableConsumer<AbstractProjectSettingsStep> callback, + @NotNull final DirectoryProjectGenerator projectGenerator, + @NotNull final String name, boolean isWelcomeScreen) { + super(name, true); getTemplatePresentation().setIcon(projectGenerator.getLogo()); - mySettings = new ProjectSpecificSettingsStep(projectGenerator, callback); + mySettings = new ProjectSpecificSettingsStep(projectGenerator, callback, isWelcomeScreen); add(mySettings); } diff --git a/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificSettingsStep.java b/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificSettingsStep.java index 5e60601399bb..b85a06e0daa6 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificSettingsStep.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificSettingsStep.java @@ -31,8 +31,8 @@ import javax.swing.*; public class ProjectSpecificSettingsStep extends AbstractProjectSettingsStep implements DumbAware { public ProjectSpecificSettingsStep(@NotNull final DirectoryProjectGenerator projectGenerator, - @NotNull final NullableConsumer<AbstractProjectSettingsStep> callback) { - super(projectGenerator, callback); + @NotNull final NullableConsumer<AbstractProjectSettingsStep> callback, boolean isWelcomeScreen) { + super(projectGenerator, callback, isWelcomeScreen); } @Override diff --git a/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java b/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java index 4f9f1074df68..0628c6d829c1 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java @@ -16,153 +16,33 @@ package com.jetbrains.python.newProject.actions; import com.google.common.collect.Lists; -import com.intellij.ide.GeneralSettings; -import com.intellij.ide.util.projectWizard.WebProjectTemplate; -import com.intellij.internal.statistic.UsageTrigger; -import com.intellij.internal.statistic.beans.ConvertUsagesUtil; import com.intellij.openapi.actionSystem.DefaultActionGroup; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.DumbAware; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.projectRoots.ProjectJdkTable; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.projectRoots.SdkAdditionalData; -import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil; -import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel; -import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.platform.DirectoryProjectGenerator; -import com.intellij.platform.PlatformProjectOpenProcessor; -import com.intellij.projectImport.ProjectOpenedCallback; import com.intellij.util.NullableConsumer; -import com.jetbrains.python.configuration.PyConfigurableInterpreterList; import com.jetbrains.python.newProject.PyFrameworkProjectGenerator; -import com.jetbrains.python.newProject.PyNewProjectSettings; import com.jetbrains.python.newProject.PythonBaseProjectGenerator; import com.jetbrains.python.newProject.PythonProjectGenerator; -import com.jetbrains.python.sdk.PyDetectedSdk; -import com.jetbrains.python.sdk.PySdkService; -import com.jetbrains.python.sdk.PythonSdkAdditionalData; -import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; import java.util.Arrays; import java.util.Comparator; import java.util.List; public class PyCharmNewProjectStep extends DefaultActionGroup implements DumbAware { - private static final Logger LOG = Logger.getInstance(PyCharmNewProjectStep.class); public PyCharmNewProjectStep(@NotNull final String name, @Nullable final Runnable runnable) { - super(name, true); - - final NullableConsumer<AbstractProjectSettingsStep> callback = new NullableConsumer<AbstractProjectSettingsStep>() { - @Override - public void consume(@Nullable AbstractProjectSettingsStep settingsStep) { - if (runnable != null) - runnable.run(); - if (settingsStep == null) return; - - Sdk sdk = settingsStep.getSdk(); - final Project project = ProjectManager.getInstance().getDefaultProject(); - final ProjectSdksModel model = PyConfigurableInterpreterList.getInstance(project).getModel(); - if (sdk instanceof PyDetectedSdk) { - final String name = sdk.getName(); - VirtualFile sdkHome = ApplicationManager.getApplication().runWriteAction(new Computable<VirtualFile>() { - @Override - public VirtualFile compute() { - return LocalFileSystem.getInstance().refreshAndFindFileByPath(name); - } - }); - PySdkService.getInstance().solidifySdk(sdk); - sdk = SdkConfigurationUtil.setupSdk(ProjectJdkTable.getInstance().getAllJdks(), sdkHome, PythonSdkType.getInstance(), true, null, - null); - model.addSdk(sdk); - settingsStep.setSdk(sdk); - try { - model.apply(); - } - catch (ConfigurationException exception) { - LOG.error("Error adding detected python interpreter " + exception.getMessage()); - } - } - Project newProject = generateProject(project, settingsStep); - if (newProject != null) { - SdkConfigurationUtil.setDirectoryProjectSdk(newProject, sdk); - final List<Sdk> sdks = PythonSdkType.getAllSdks(); - for (Sdk s : sdks) { - final SdkAdditionalData additionalData = s.getSdkAdditionalData(); - if (additionalData instanceof PythonSdkAdditionalData) { - ((PythonSdkAdditionalData)additionalData).reassociateWithCreatedProject(newProject); - } - } - } - } - - @Nullable - private Project generateProject(@NotNull final Project project, @NotNull final AbstractProjectSettingsStep settings) { - final DirectoryProjectGenerator generator = settings.getProjectGenerator(); - final File location = new File(settings.getProjectLocation()); - if (!location.exists() && !location.mkdirs()) { - Messages.showErrorDialog(project, "Cannot create directory '" + location + "'", "Create Project"); - return null; - } - - final VirtualFile baseDir = ApplicationManager.getApplication().runWriteAction(new Computable<VirtualFile>() { - public VirtualFile compute() { - return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(location); - } - }); - LOG.assertTrue(baseDir != null, "Couldn't find '" + location + "' in VFS"); - baseDir.refresh(false, true); - - if (baseDir.getChildren().length > 0) { - int rc = Messages.showYesNoDialog(project, - "The directory '" + location + - "' is not empty. Would you like to create a project from existing sources instead?", - "Create New Project", Messages.getQuestionIcon()); - if (rc == Messages.YES) { - return PlatformProjectOpenProcessor.getInstance().doOpenProject(baseDir, null, false); - } - } + this(name, runnable, false); + } - String generatorName = generator == null ? "empty" : ConvertUsagesUtil.ensureProperKey(generator.getName()); - UsageTrigger.trigger("NewDirectoryProjectAction." + generatorName); + public PyCharmNewProjectStep(@NotNull final String name, @Nullable final Runnable runnable, boolean isWelcomeScreen) { + super(name, true); - GeneralSettings.getInstance().setLastProjectCreationLocation(location.getParent()); + final NullableConsumer<AbstractProjectSettingsStep> callback = new GenerateProjectCallback(runnable); - return PlatformProjectOpenProcessor.doOpenProject(baseDir, null, false, -1, new ProjectOpenedCallback() { - @Override - public void projectOpened(Project project, Module module) { - if (generator != null) { - Object projectSettings = null; - if (generator instanceof PythonProjectGenerator) - projectSettings = ((PythonProjectGenerator)generator).getProjectSettings(); - else if (generator instanceof WebProjectTemplate) { - projectSettings = ((WebProjectTemplate)generator).getPeer().getSettings(); - } - if (projectSettings instanceof PyNewProjectSettings) { - ((PyNewProjectSettings)projectSettings).setSdk(settings.getSdk()); - ((PyNewProjectSettings)projectSettings).setInstallFramework(settings.installFramework()); - } - //noinspection unchecked - generator.generateProject(project, baseDir, projectSettings, module); - } - } - }, false); - } - }; - - final ProjectSpecificAction action = new ProjectSpecificAction(callback, new PythonBaseProjectGenerator()); + final ProjectSpecificAction action = new ProjectSpecificAction(callback, new PythonBaseProjectGenerator(), isWelcomeScreen); add(action); final DirectoryProjectGenerator[] generators = Extensions.getExtensions(DirectoryProjectGenerator.EP_NAME); @@ -181,19 +61,17 @@ public class PyCharmNewProjectStep extends DefaultActionGroup implements DumbAwa List<DirectoryProjectGenerator> pluginSpecificGenerators = Lists.newArrayList(); for (DirectoryProjectGenerator generator : generators) { if (generator instanceof PythonProjectGenerator) - add(new ProjectSpecificAction(callback, generator)); + add(new ProjectSpecificAction(callback, generator, isWelcomeScreen)); else pluginSpecificGenerators.add(generator); } if (!pluginSpecificGenerators.isEmpty()) { - add(new PluginSpecificProjectsStep(callback, pluginSpecificGenerators)); + add(new PluginSpecificProjectsStep(callback, pluginSpecificGenerators, isWelcomeScreen)); } } public PyCharmNewProjectStep() { - this("Select Project Type", null); - + this("Select Project Type", null, true); } - } |