From 9c6440492557d34f371f5ef0f038492e9dfb3bd1 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Wed, 20 Dec 2017 01:04:06 +0300 Subject: [PATCH] PY-22578: Use working dir or project root as init. value for "Browse" When TextFieldWithBrowseButton does not have correct value it shows process cwd, which is not what user wants. For Python run configurations one may use PyBrowseActionListener that has fallback to AbstractPythonRunConfiguration workDir logic: it uses workdir or project root or first module root etc. There is also small refactoring to simplify FileChooserDescriptor for Python --- .../python/FileChooserDescriptorExt.kt | 11 +++++++ .../python/run/PyBrowseActionListener.kt | 22 ++++++++++++++ .../run/PythonRunConfigurationForm.java | 30 +++++++------------ .../python/testing/PyTestSharedForm.java | 11 +++---- 4 files changed, 50 insertions(+), 24 deletions(-) create mode 100644 python/src/com/jetbrains/extensions/python/FileChooserDescriptorExt.kt create mode 100644 python/src/com/jetbrains/python/run/PyBrowseActionListener.kt diff --git a/python/src/com/jetbrains/extensions/python/FileChooserDescriptorExt.kt b/python/src/com/jetbrains/extensions/python/FileChooserDescriptorExt.kt new file mode 100644 index 000000000000..1c4e7953aff0 --- /dev/null +++ b/python/src/com/jetbrains/extensions/python/FileChooserDescriptorExt.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + */ +package com.jetbrains.extensions.python + +import com.intellij.openapi.fileChooser.FileChooserDescriptor +import com.jetbrains.python.PyNames + +@JvmOverloads +fun FileChooserDescriptor.withPythonFiles(allowFilesWithNoExtension: Boolean = false) = + this.withFileFilter { it.name.endsWith(PyNames.DOT_PY) || (allowFilesWithNoExtension && it.extension == null) }!! diff --git a/python/src/com/jetbrains/python/run/PyBrowseActionListener.kt b/python/src/com/jetbrains/python/run/PyBrowseActionListener.kt new file mode 100644 index 000000000000..2e25cbf1a93a --- /dev/null +++ b/python/src/com/jetbrains/python/run/PyBrowseActionListener.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + */ +package com.jetbrains.python.run + +import com.intellij.openapi.fileChooser.FileChooserDescriptor +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory +import com.intellij.openapi.ui.TextBrowseFolderListener +import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.openapi.vfs.VirtualFile +import com.jetbrains.extensions.python.withPythonFiles + +open class PyBrowseActionListener +@JvmOverloads +constructor(private val configuration: AbstractPythonRunConfiguration<*>, + chooserDescriptor: FileChooserDescriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor().withPythonFiles()) + : TextBrowseFolderListener(chooserDescriptor, configuration.getProject()) { + + override final fun getInitialFile(): VirtualFile? = + super.getInitialFile() ?: LocalFileSystem.getInstance().findFileByPath(configuration.getWorkingDirectorySafe()) + +} \ No newline at end of file diff --git a/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java b/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java index 959136e47d68..2233e267654c 100644 --- a/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java +++ b/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java @@ -17,16 +17,14 @@ package com.jetbrains.python.run; import com.google.common.collect.Lists; import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.ui.ComponentWithBrowseButton; -import com.intellij.openapi.ui.TextComponentAccessor; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -39,6 +37,7 @@ import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.components.JBComboBoxLabel; import com.intellij.ui.components.JBLabel; import com.jetbrains.PySymbolFieldWithBrowseButton; +import com.jetbrains.extensions.python.FileChooserDescriptorExtKt; import com.jetbrains.extenstions.ContextAnchor; import com.jetbrains.extenstions.ModuleBasedContextAnchor; import com.jetbrains.extenstions.ProjectSdkContextAnchor; @@ -84,26 +83,19 @@ public class PythonRunConfigurationForm implements PythonRunConfigurationParams, myProject = configuration.getProject(); - FileChooserDescriptor chooserDescriptor = new FileChooserDescriptor(true, false, false, false, false, false) { + final FileChooserDescriptor chooserDescriptor = + FileChooserDescriptorExtKt.withPythonFiles(FileChooserDescriptorFactory.createSingleFileDescriptor().withTitle("Select Script"), true); + + final PyBrowseActionListener listener = new PyBrowseActionListener(configuration, chooserDescriptor) { + @Override - public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) { - return file.isDirectory() || file.getExtension() == null || Comparing.equal(file.getExtension(), "py"); + protected void onFileChosen(@NotNull final VirtualFile chosenFile) { + super.onFileChosen(chosenFile); + myCommonOptionsForm.setWorkingDirectory(chosenFile.getParent().getPath()); } }; - //chooserDescriptor.setRoot(s.getProject().getBaseDir()); - ComponentWithBrowseButton.BrowseFolderActionListener listener = - new ComponentWithBrowseButton.BrowseFolderActionListener("Select Script", "", myScriptTextField, myProject, - chooserDescriptor, TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT) { - - @Override - protected void onFileChosen(@NotNull VirtualFile chosenFile) { - super.onFileChosen(chosenFile); - myCommonOptionsForm.setWorkingDirectory(chosenFile.getParent().getPath()); - } - }; - - myScriptTextField.addActionListener(listener); + myScriptTextField.addBrowseFolderListener(listener); if (SystemInfo.isWindows) { //TODO: enable it on Windows when it works there diff --git a/python/src/com/jetbrains/python/testing/PyTestSharedForm.java b/python/src/com/jetbrains/python/testing/PyTestSharedForm.java index b5f0e140dff1..26dced64c331 100644 --- a/python/src/com/jetbrains/python/testing/PyTestSharedForm.java +++ b/python/src/com/jetbrains/python/testing/PyTestSharedForm.java @@ -17,6 +17,7 @@ package com.jetbrains.python.testing; import com.google.common.collect.ObjectArrays; import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.TextBrowseFolderListener; @@ -24,6 +25,7 @@ import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.TextAccessor; @@ -33,12 +35,14 @@ import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.util.ThreeState; import com.intellij.util.ui.JBUI; import com.jetbrains.PySymbolFieldWithBrowseButton; +import com.jetbrains.extensions.python.FileChooserDescriptorExtKt; import com.jetbrains.extenstions.ContextAnchor; import com.jetbrains.extenstions.ModuleBasedContextAnchor; import com.jetbrains.extenstions.ProjectSdkContextAnchor; import com.jetbrains.python.PyNames; import com.jetbrains.python.psi.types.TypeEvalContext; import com.jetbrains.python.run.AbstractPyCommonOptionsForm; +import com.jetbrains.python.run.PyBrowseActionListener; import com.jetbrains.python.run.PyCommonOptionsFormFactory; import com.jetbrains.reflection.ReflectionUtilsKt; import com.jetbrains.reflection.SimplePropertiesProvider; @@ -64,10 +68,6 @@ public final class PyTestSharedForm implements SimplePropertiesProvider { * Regex to convert additionalArgumentNames to "Additional Argument Names" */ private static final Pattern CAPITAL_LETTER = Pattern.compile("(?=\\p{Upper})"); - private static final FileChooserDescriptor FILE_CHOOSER_DESCRIPTOR = - new FileChooserDescriptor(true, true, false, false, false, false) - .withFileFilter(file -> file.isDirectory() || file.getName().endsWith(PyNames.DOT_PY)); - private JPanel myPanel; /** @@ -116,7 +116,8 @@ public final class PyTestSharedForm implements SimplePropertiesProvider { @NotNull final PyAbstractTestConfiguration configuration) { myPathTarget = new TextFieldWithBrowseButton(); final Project project = configuration.getProject(); - myPathTarget.addBrowseFolderListener(new TextBrowseFolderListener(FILE_CHOOSER_DESCRIPTOR)); + + myPathTarget.addBrowseFolderListener(new PyBrowseActionListener(configuration)); final TypeEvalContext context = TypeEvalContext.userInitiated(project, null); final ThreeState testClassRequired = configuration.isTestClassRequired();