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();