mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user