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
This commit is contained in:
Ilya.Kazakevich
2017-12-22 03:07:07 +03:00
parent 35b9ea41ff
commit 9c64404925
4 changed files with 50 additions and 24 deletions
@@ -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) }!!
@@ -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())
}
@@ -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<JTextField> listener =
new ComponentWithBrowseButton.BrowseFolderActionListener<JTextField>("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
@@ -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();