diff options
Diffstat (limited to 'python/ide/src/com/jetbrains')
4 files changed, 88 insertions, 20 deletions
diff --git a/python/ide/src/com/jetbrains/python/newProject/PyCharmNewProjectDialog.java b/python/ide/src/com/jetbrains/python/newProject/PyCharmNewProjectDialog.java index d186f33620e5..7570e3f05b31 100644 --- a/python/ide/src/com/jetbrains/python/newProject/PyCharmNewProjectDialog.java +++ b/python/ide/src/com/jetbrains/python/newProject/PyCharmNewProjectDialog.java @@ -16,9 +16,11 @@ package com.jetbrains.python.newProject; import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.wm.impl.welcomeScreen.CardActionsPanel; +import com.intellij.platform.DirectoryProjectGenerator; import com.jetbrains.python.newProject.actions.PyCharmNewProjectStep; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,7 +44,8 @@ public class PyCharmNewProjectDialog extends DialogWrapper { PyCharmNewProjectDialog.this.close(OK_EXIT_CODE); } }; - final DefaultActionGroup root = new PyCharmNewProjectStep(runnable); + final DirectoryProjectGenerator[] generators = Extensions.getExtensions(DirectoryProjectGenerator.EP_NAME); + final DefaultActionGroup root = new PyCharmNewProjectStep(generators.length == 0 ? "Create Project" : "Select Project Type", runnable); return new CardActionsPanel(root) { @@ -53,6 +56,7 @@ public class PyCharmNewProjectDialog extends DialogWrapper { @Override public Dimension getMinimumSize() { + if (generators.length == 0) return new Dimension(550, 200); return new Dimension(650, 450); } }; 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 d9f3cf24f0e5..6ba283caf199 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/AbstractProjectSettingsStep.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/AbstractProjectSettingsStep.java @@ -8,6 +8,7 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.actionSystem.impl.ActionButtonWithText; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.DumbAware; @@ -45,10 +46,12 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.Border; +import javax.swing.border.LineBorder; import javax.swing.event.DocumentEvent; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -62,9 +65,10 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane private boolean myInstallFramework; private TextFieldWithBrowseButton myLocationField; protected final File myProjectDirectory; - private ActionButtonWithText myCreateButton; + private Button myCreateButton; private JLabel myErrorLabel; private AnAction myCreateAction; + private Sdk mySdk; public AbstractProjectSettingsStep(DirectoryProjectGenerator projectGenerator, NullableConsumer<AbstractProjectSettingsStep> callback) { super(); @@ -104,16 +108,24 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane @Override public JPanel createPanel() { - final JPanel mainPanel = new JPanel(new BorderLayout()); + final JPanel basePanel = createBasePanel(); + final JPanel mainPanel = new JPanel(new BorderLayout()) { + @Override + protected void paintComponent(Graphics g) { + myLocationField.requestFocus(); + } + }; + final JPanel scrollPanel = new JPanel(new BorderLayout()); - mainPanel.setPreferredSize(new Dimension(mainPanel.getPreferredSize().width, 400)); + final DirectoryProjectGenerator[] generators = Extensions.getExtensions(DirectoryProjectGenerator.EP_NAME); + final int height = generators.length == 0 ? 150 : 400; + mainPanel.setPreferredSize(new Dimension(mainPanel.getPreferredSize().width, height)); myErrorLabel = new JLabel(""); myErrorLabel.setForeground(JBColor.RED); myCreateButton = new Button(myCreateAction, myCreateAction.getTemplatePresentation()); - final JPanel panel = createBasePanel(); - scrollPanel.add(panel, BorderLayout.NORTH); + scrollPanel.add(basePanel, BorderLayout.NORTH); final JPanel advancedSettings = createAdvancedSettings(); if (advancedSettings != null) { scrollPanel.add(advancedSettings, BorderLayout.CENTER); @@ -125,8 +137,6 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane final JPanel bottomPanel = new JPanel(new BorderLayout()); - - myCreateButton.setPreferredSize(new Dimension(mainPanel.getPreferredSize().width, 40)); bottomPanel.add(myErrorLabel, BorderLayout.NORTH); bottomPanel.add(myCreateButton, BorderLayout.EAST); mainPanel.add(bottomPanel, BorderLayout.SOUTH); @@ -150,7 +160,22 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); myLocationField.addBrowseFolderListener("Select base directory", "Select base directory for the Project", null, descriptor); - + myLocationField.getTextField().getDocument().addDocumentListener(new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + if (myProjectGenerator instanceof PythonProjectGenerator) { + String path = myLocationField.getText().trim(); + if (path.endsWith(File.separator)) { + path = path.substring(0, path.length() - File.separator.length()); + } + int ind = path.lastIndexOf(File.separator); + if (ind != -1) { + String projectName = path.substring(ind + 1, path.length()); + ((PythonProjectGenerator)myProjectGenerator).locationChanged(projectName); + } + } + } + }); final JLabel locationLabel = new JLabel("Location:"); c.gridx = 0; c.gridy = 0; @@ -193,13 +218,23 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane c.gridy = 1; c.weightx = 1.; panel.add(mySdkCombo, c); - + final JPanel basePanelExtension = extendBasePanel(); + if (basePanelExtension != null) { + c.gridwidth = 2; + c.gridy = 2; + c.gridx = 0; + panel.add(basePanelExtension, c); + } registerValidators(); return panel; } - protected void registerValidators() { + @Nullable + protected JPanel extendBasePanel() { + return null; + } + protected void registerValidators() { myLocationField.getTextField().getDocument().addDocumentListener(new DocumentAdapter() { @Override protected void textChanged(DocumentEvent e) { @@ -358,7 +393,8 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane public Button(AnAction action, Presentation presentation) { super(action, presentation, "NewProject", new Dimension(70, 50)); - myBorder = UIUtil.isUnderDarcula() ? UIUtil.getButtonBorder() : BorderFactory.createLineBorder(UIUtil.getBorderColor()); + final Border border = new LineBorder(JBColor.border(), 1, true); + myBorder = UIUtil.isUnderDarcula() ? UIUtil.getButtonBorder() : border; setBorder(myBorder); } @@ -368,6 +404,23 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane } @Override + public boolean isFocusable() { + return true; + } + + @Override + protected void processFocusEvent(FocusEvent e) { + super.processFocusEvent(e); + if (e.getID() == FocusEvent.FOCUS_GAINED) { + processMouseEvent(new MouseEvent(this, MouseEvent.MOUSE_ENTERED, System.currentTimeMillis(), 0, 0, 0, 0, false)); + + } + else if (e.getID() == FocusEvent.FOCUS_LOST) { + processMouseEvent(new MouseEvent(this, MouseEvent.MOUSE_EXITED, System.currentTimeMillis(), 0, 0, 0, 0, false)); + } + } + + @Override public Insets getInsets() { return new Insets(5,10,5,5); } @@ -377,11 +430,6 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane return SwingConstants.LEFT; } - @Override - public String getToolTipText() { - return null; - } - protected void processMouseEvent(MouseEvent e) { super.processMouseEvent(e); if (e.getID() == MouseEvent.MOUSE_ENTERED) { @@ -394,9 +442,14 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane } public Sdk getSdk() { + if (mySdk != null) return mySdk; return (Sdk)mySdkCombo.getComboBox().getSelectedItem(); } + public void setSdk(final Sdk sdk) { + mySdk = sdk; + } + public String getProjectLocation() { return myLocationField.getText(); } 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 ebd0658b072c..5e60601399bb 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificSettingsStep.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/ProjectSpecificSettingsStep.java @@ -15,6 +15,7 @@ */ package com.jetbrains.python.newProject.actions; +import com.intellij.facet.ui.ValidationResult; import com.intellij.ide.util.projectWizard.WebProjectTemplate; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.ui.VerticalFlowLayout; @@ -46,6 +47,12 @@ public class ProjectSpecificSettingsStep extends AbstractProjectSettingsStep imp if (advancedSettings != null) { final JPanel jPanel = new JPanel(new VerticalFlowLayout()); final HideableDecorator deco = new HideableDecorator(jPanel, "Mor&e Settings", false); + boolean isValid = checkValid(); + deco.setOn(!isValid); + if (myProjectGenerator instanceof PythonProjectGenerator && !deco.isExpanded()) { + final ValidationResult result = ((PythonProjectGenerator)myProjectGenerator).warningValidation(getSdk()); + deco.setOn(!result.isOk()); + } deco.setContentComponent(advancedSettings); return jPanel; } 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 b6134ed5f070..4f9f1074df68 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java @@ -62,8 +62,8 @@ import java.util.List; public class PyCharmNewProjectStep extends DefaultActionGroup implements DumbAware { private static final Logger LOG = Logger.getInstance(PyCharmNewProjectStep.class); - public PyCharmNewProjectStep(@Nullable final Runnable runnable) { - super("Select Project Type", true); + public PyCharmNewProjectStep(@NotNull final String name, @Nullable final Runnable runnable) { + super(name, true); final NullableConsumer<AbstractProjectSettingsStep> callback = new NullableConsumer<AbstractProjectSettingsStep>() { @Override @@ -87,6 +87,7 @@ public class PyCharmNewProjectStep extends DefaultActionGroup implements DumbAwa sdk = SdkConfigurationUtil.setupSdk(ProjectJdkTable.getInstance().getAllJdks(), sdkHome, PythonSdkType.getInstance(), true, null, null); model.addSdk(sdk); + settingsStep.setSdk(sdk); try { model.apply(); } @@ -165,6 +166,9 @@ public class PyCharmNewProjectStep extends DefaultActionGroup implements DumbAwa add(action); final DirectoryProjectGenerator[] generators = Extensions.getExtensions(DirectoryProjectGenerator.EP_NAME); + if (generators.length == 0) { + action.setPopup(false); + } Arrays.sort(generators, new Comparator<DirectoryProjectGenerator>() { @Override public int compare(DirectoryProjectGenerator o1, DirectoryProjectGenerator o2) { @@ -188,7 +192,7 @@ public class PyCharmNewProjectStep extends DefaultActionGroup implements DumbAwa } public PyCharmNewProjectStep() { - this(null); + this("Select Project Type", null); } |