[project] replacing FileChooserDescriptor#isFileVisible with file- and/or extension-based filters (IJPL-150176)

GitOrigin-RevId: 7176005f3d39d2f2e928c2e5f804de173e5d83f4
This commit is contained in:
Roman Shevchenko
2024-09-30 20:42:40 +02:00
committed by intellij-monorepo-bot
parent 410f7661a6
commit 69479687e5
26 changed files with 166 additions and 325 deletions

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2020 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.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.compiler.options;
import com.intellij.ide.util.ElementsChooser;
@@ -14,7 +14,6 @@ import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.IdeBorderFactory;
@@ -56,13 +55,9 @@ public class ValidationConfigurable implements SearchableConfigurable, Configura
}
private static ExcludedEntriesConfigurable createExcludedConfigurable(@NotNull Project project) {
ProjectFileIndex index = project.isDefault() ? null : ProjectRootManager.getInstance(project).getFileIndex();
final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, false, false, false, true) {
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
return super.isFileVisible(file, showHiddenFiles) && (index == null || !index.isExcluded(file));
}
};
var index = project.isDefault() ? null : ProjectRootManager.getInstance(project).getFileIndex();
var descriptor = new FileChooserDescriptor(true, true, false, false, false, true)
.withFileFilter(file -> index == null || !index.isExcluded(file));
List<VirtualFile> allContentRoots = new ArrayList<>();
for (final Module module: ModuleManager.getInstance(project).getModules()) {

View File

@@ -3,7 +3,7 @@ package com.intellij.packaging.impl.ui.properties;
import com.intellij.openapi.compiler.JavaCompilerBundle;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.io.FileUtil;
@@ -86,15 +86,10 @@ public abstract class ElementWithManifestPropertiesPanel<E extends CompositeElem
}
private void chooseManifest() {
final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) {
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
return super.isFileVisible(file, showHiddenFiles) && (file.isDirectory() ||
file.getName().equalsIgnoreCase(ManifestFileUtil.MANIFEST_FILE_NAME));
}
};
descriptor.setTitle(JavaCompilerBundle.message("specify.path.to.manifest.mf.file"));
final VirtualFile file = FileChooser.chooseFile(descriptor, myContext.getProject(), null);
var descriptor = FileChooserDescriptorFactory.createSingleFileDescriptor("MF")
.withFileFilter(file -> file.getName().equalsIgnoreCase(ManifestFileUtil.MANIFEST_FILE_NAME))
.withTitle(JavaCompilerBundle.message("specify.path.to.manifest.mf.file"));
var file = FileChooser.chooseFile(descriptor, myContext.getProject(), null);
if (file == null) return;
ManifestFileUtil.addManifestFileToLayout(file.getPath(), myContext, myElement);

View File

@@ -8,7 +8,6 @@ import com.intellij.debugger.engine.JVMNameUtil;
import com.intellij.debugger.jdi.DecompiledLocalVariable;
import com.intellij.debugger.ui.JavaDebuggerSupport;
import com.intellij.icons.AllIcons;
import com.intellij.ide.highlighter.ArchiveFileType;
import com.intellij.ide.ui.laf.darcula.DarculaUIUtil;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -18,8 +17,7 @@ import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserFactory;
import com.intellij.openapi.fileChooser.FileSaverDescriptor;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.options.Configurable.NoScroll;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
@@ -232,20 +230,10 @@ public final class CaptureConfigurable implements SearchableConfigurable, NoScro
AllIcons.Actions.Install) {
@Override
public void actionPerformed(@NotNull final AnActionEvent e) {
FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, true, false, true, true) {
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
return super.isFileVisible(file, showHiddenFiles) &&
(file.isDirectory() || "xml".equals(file.getExtension()) || FileTypeRegistry.getInstance().isFileOfType(file, ArchiveFileType.INSTANCE));
}
@Override
public boolean isFileSelectable(@Nullable VirtualFile file) {
return file != null && FileTypeRegistry.getInstance().isFileOfType(file, StdFileTypes.XML);
}
};
descriptor.setDescription(JavaDebuggerBundle.message("please.select.a.file.to.import"));
descriptor.setTitle(JavaDebuggerBundle.message("import.capture.points"));
var descriptor = new FileChooserDescriptor(true, false, true, false, true, true)
.withExtensionFilter(FileTypeManager.getInstance().getStdFileType("XML"))
.withTitle(JavaDebuggerBundle.message("import.capture.points"))
.withDescription(JavaDebuggerBundle.message("please.select.a.file.to.import"));
VirtualFile[] files = FileChooser.chooseFiles(descriptor, e.getProject(), null);
if (ArrayUtil.isEmpty(files)) return;

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2019 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.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.diff;
import com.intellij.diff.util.DiffUtil;
@@ -177,12 +177,7 @@ public class VirtualFileDiffElement extends DiffElement<VirtualFile> {
}
protected FileChooserDescriptor getChooserDescriptor() {
return new FileChooserDescriptor(true, true, true, true, false, false) {
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
return file.isDirectory() || file.getFileType() instanceof ArchiveFileType;
}
};
return new FileChooserDescriptor(true, true, true, true, false, false).withExtensionFilter(ArchiveFileType.INSTANCE);
}
@Override

View File

@@ -461,18 +461,11 @@ public final class RunConfigurationStorageUi {
}
private @NotNull ComboBox<String> createPathComboBox(@NotNull Project project, @NotNull Disposable uiDisposable) {
ComboBox<String> comboBox = new ComboBox<>(JBUI.scale(500));
var comboBox = new ComboBox<String>(JBUI.scale(500));
comboBox.setEditable(true);
// chooseFiles is set to true to be able to select project.ipr file in IPR-based projects. Other files are not visible/selectable in the chooser
FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, false, false, false, false) {
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
// dotIdeaStoragePath may be a path to the project.ipr file in IPR-based projects
if (file.getPath().equals(myDotIdeaStoragePath)) return true;
return file.isDirectory() && super.isFileVisible(file, showHiddenFiles);
}
// `chooseFiles` is set to `true` to be able to select 'project.ipr' file in IPR-based projects; other files are not selectable
var descriptor = new FileChooserDescriptor(true, true, false, false, false, false) {
@Override
public boolean isFileSelectable(@Nullable VirtualFile file) {
if (file == null) return false;
@@ -485,7 +478,7 @@ public final class RunConfigurationStorageUi {
}
};
Runnable selectFolderAction = new BrowseFolderRunnable<>(project, descriptor, comboBox, TextComponentAccessor.STRING_COMBOBOX_WHOLE_TEXT);
var selectFolderAction = new BrowseFolderRunnable<>(project, descriptor, comboBox, TextComponentAccessor.STRING_COMBOBOX_WHOLE_TEXT);
comboBox.initBrowsableEditor(selectFolderAction, uiDisposable);
return comboBox;
}

View File

@@ -1476,7 +1476,7 @@ c:com.intellij.openapi.fileChooser.FileChooserDescriptor
- isChooseJarsAsFiles():Z
- isChooseMultiple():Z
- isFileSelectable(com.intellij.openapi.vfs.VirtualFile):Z
- isFileVisible(com.intellij.openapi.vfs.VirtualFile,Z):Z
- F:isFileVisible(com.intellij.openapi.vfs.VirtualFile,Z):Z
- isForcedToUseIdeaFileChooser():Z
- isHideIgnored():Z
- isShowFileSystemRoots():Z
@@ -1504,6 +1504,7 @@ c:com.intellij.openapi.fileChooser.FileChooserDescriptor
- withShowHiddenFiles(Z):com.intellij.openapi.fileChooser.FileChooserDescriptor
- withTitle(java.lang.String):com.intellij.openapi.fileChooser.FileChooserDescriptor
- withTreeRootVisible(Z):com.intellij.openapi.fileChooser.FileChooserDescriptor
- withoutExtensionFilter():com.intellij.openapi.fileChooser.FileChooserDescriptor
f:com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
- s:createAllButJarContentsDescriptor():com.intellij.openapi.fileChooser.FileChooserDescriptor
- s:createMultipleFilesNoJarsDescriptor():com.intellij.openapi.fileChooser.FileChooserDescriptor

View File

@@ -48,7 +48,8 @@ public class FileChooserDescriptor implements Cloneable {
private boolean myTreeRootVisible = false;
private boolean myShowHiddenFiles = false;
private @Nullable Pair<@Nls String, List<String>> myExtensionFilter = null;
private Predicate<? super VirtualFile> myFileFilter = null;
private FileType @Nullable [] myFileTypeFilter = null;
private @Nullable Predicate<? super VirtualFile> myFileFilter = null;
private boolean myForcedToUseIdeaFileChooser = false;
private final Map<String, Object> myUserData = new HashMap<>();
@@ -89,6 +90,7 @@ public class FileChooserDescriptor implements Cloneable {
myTreeRootVisible = d.isTreeRootVisible();
myShowHiddenFiles = d.isShowHiddenFiles();
myExtensionFilter = d.myExtensionFilter;
myFileTypeFilter = d.myFileTypeFilter;
myFileFilter = d.myFileFilter;
myForcedToUseIdeaFileChooser = false;
myUserData.putAll(d.myUserData);
@@ -241,7 +243,7 @@ public class FileChooserDescriptor implements Cloneable {
.map(matcher -> matcher instanceof ExtensionFileNameMatcher em ? em.getExtension() : null)
.filter(Objects::nonNull)
.toArray(String[]::new);
myFileFilter = file -> ContainerUtil.exists(types, type -> FileTypeRegistry.getInstance().isFileOfType(file, type));
myFileTypeFilter = types;
return withExtensionFilter(label, extensions);
}
@@ -266,12 +268,19 @@ public class FileChooserDescriptor implements Cloneable {
return this;
}
public FileChooserDescriptor withoutExtensionFilter() {
myExtensionFilter = null;
myFileTypeFilter = null;
return this;
}
/**
* Defines whether a file is visible in the tree.
*
* @deprecated ignored by native file choosers; use {@link #withFileFilter} and {@link #withExtensionFilter} instead.
*/
@Deprecated
@ApiStatus.NonExtendable
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
if (file.is(VFileProperty.SYMLINK) && file.getCanonicalPath() == null) {
return false;
@@ -289,6 +298,9 @@ public class FileChooserDescriptor implements Cloneable {
if (myExtensionFilter != null && !matchesExtFilter(file, myExtensionFilter.second)) {
return false;
}
if (myFileTypeFilter != null && !matchesTypeFilter(file, myFileTypeFilter)) {
return false;
}
if (myFileFilter != null && !myFileFilter.test(file)) {
return false;
}
@@ -322,6 +334,9 @@ public class FileChooserDescriptor implements Cloneable {
if (myExtensionFilter != null) {
return matchesExtFilter(file, myExtensionFilter.second);
}
if (myFileTypeFilter != null) {
return matchesTypeFilter(file, myFileTypeFilter);
}
if (myFileFilter != null) {
return myFileFilter.test(file);
}
@@ -329,6 +344,14 @@ public class FileChooserDescriptor implements Cloneable {
return acceptAsJarFile(file) || acceptAsGeneralFile(file);
}
private static boolean matchesExtFilter(VirtualFile file, List<String> extensions) {
return ContainerUtil.exists(extensions, ext -> Strings.endsWithIgnoreCase(file.getName(), '.' + ext));
}
private static boolean matchesTypeFilter(VirtualFile file, FileType[] types) {
return ContainerUtil.exists(types, type -> FileTypeRegistry.getInstance().isFileOfType(file, type));
}
/**
* Called upon <em>OK</em> action before closing dialog.
* Override to customize validation of user input.
@@ -425,10 +448,6 @@ public class FileChooserDescriptor implements Cloneable {
}
}
private static boolean matchesExtFilter(VirtualFile file, List<String> extensions) {
return ContainerUtil.exists(extensions, ext -> Strings.endsWithIgnoreCase(file.getName(), '.' + ext));
}
public <T> void putUserData(@NotNull DataKey<T> key, @Nullable T data) {
myUserData.put(key.getName(), data);
}

View File

@@ -2943,7 +2943,6 @@ c:com.intellij.ide.actions.OpenProjectFileChooserDescriptor
- <init>(Z,Z):V
- getIcon(com.intellij.openapi.vfs.VirtualFile):javax.swing.Icon
- isFileSelectable(com.intellij.openapi.vfs.VirtualFile):Z
- isFileVisible(com.intellij.openapi.vfs.VirtualFile,Z):Z
- s:isProjectFile(com.intellij.openapi.vfs.VirtualFile):Z
c:com.intellij.ide.actions.PasteAction
- com.intellij.openapi.actionSystem.AnAction

View File

@@ -17,7 +17,6 @@ import com.intellij.openapi.actionSystem.remoting.ActionRemoteBehaviorSpecificat
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.readAction
import com.intellij.openapi.fileChooser.FileChooser
import com.intellij.openapi.fileChooser.FileChooserDescriptor
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.fileChooser.PathChooserDialog
import com.intellij.openapi.fileChooser.impl.FileChooserUtil
@@ -72,7 +71,9 @@ open class OpenFileAction : AnAction(), DumbAware, LightEditCompatible, ActionRe
override fun actionPerformed(e: AnActionEvent) {
val project = e.project
val showFiles = project != null || PlatformProjectOpenProcessor.getInstanceIfItExists() != null
val descriptor: FileChooserDescriptor = if (showFiles) ProjectOrFileChooserDescriptor() else ProjectOnlyFileChooserDescriptor()
val descriptor =
if (showFiles) ProjectOrFileChooserDescriptor()
else OpenProjectFileChooserDescriptor(true).withTitle(IdeBundle.message("title.open.project"))
var toSelect: VirtualFile? = null
val defaultProjectDirectory = GeneralLocalSettings.getInstance().defaultProjectDirectory
if (defaultProjectDirectory.isNotEmpty()) {
@@ -129,13 +130,7 @@ open class OpenFileAction : AnAction(), DumbAware, LightEditCompatible, ActionRe
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
}
private class ProjectOnlyFileChooserDescriptor : OpenProjectFileChooserDescriptor(true) {
init {
title = IdeBundle.message("title.open.project")
}
}
// vanilla OpenProjectFileChooserDescriptor only accepts project files; this one is overridden to accept any files
// vanilla `OpenProjectFileChooserDescriptor` only accepts project files; this one is overridden to accept any files
private class ProjectOrFileChooserDescriptor : OpenProjectFileChooserDescriptor(true) {
private val myStandardDescriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor().withHideIgnored(false)
@@ -143,11 +138,6 @@ private class ProjectOrFileChooserDescriptor : OpenProjectFileChooserDescriptor(
title = IdeBundle.message("title.open.file.or.project")
}
override fun isFileVisible(file: VirtualFile, showHiddenFiles: Boolean): Boolean = when {
file.isDirectory -> super.isFileVisible(file, showHiddenFiles)
else -> myStandardDescriptor.isFileVisible(file, showHiddenFiles)
}
override fun isFileSelectable(file: VirtualFile?): Boolean = when {
file == null -> false
file.isDirectory -> SlowOperations.knownIssue("IJPL-162827").use {

View File

@@ -30,11 +30,6 @@ public class OpenProjectFileChooserDescriptor extends FileChooserDescriptor {
setHideIgnored(false);
}
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
return super.isFileVisible(file, showHiddenFiles) && (file.isDirectory() || isProjectFile(file));
}
@Override
public boolean isFileSelectable(@Nullable VirtualFile file) {
return file != null && (isProjectDirectory(file) || isProjectFile(file));

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.vcs.log.ui.filter;
import com.intellij.ide.util.treeView.NodeDescriptor;
@@ -134,18 +134,14 @@ public class VcsStructureChooser extends DialogWrapper {
myTree.setRootVisible(false);
myTree.setExpandableItemsEnabled(false);
FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, true, true, false, true) {
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
if (!super.isFileVisible(file, showHiddenFiles)) return false;
if (myRoots.contains(file)) return false;
ChangeListManager changeListManager = ChangeListManager.getInstance(myProject);
return !changeListManager.isIgnoredFile(file) && !changeListManager.isUnversioned(file);
}
};
descriptor.withRoots(new ArrayList<>(myRoots)).withShowHiddenFiles(true).withHideIgnored(true);
MyCheckboxTreeCellRenderer cellRenderer = new MyCheckboxTreeCellRenderer(mySelectionManager, myModulesSet, myProject, myTree, myRoots);
FileSystemTreeImpl fileSystemTree = new MyFileSystemTreeImpl(myProject, descriptor, myTree, cellRenderer, myModulesSet);
var changeListManager = ChangeListManager.getInstance(myProject);
var descriptor = new FileChooserDescriptor(true, true, true, true, false, true)
.withFileFilter(file -> !myRoots.contains(file) && !changeListManager.isIgnoredFile(file) && !changeListManager.isUnversioned(file))
.withRoots(new ArrayList<>(myRoots))
.withShowHiddenFiles(true)
.withHideIgnored(true);
var cellRenderer = new MyCheckboxTreeCellRenderer(mySelectionManager, myModulesSet, myProject, myTree, myRoots);
var fileSystemTree = new MyFileSystemTreeImpl(myProject, descriptor, myTree, cellRenderer, myModulesSet);
Disposer.register(myDisposable, fileSystemTree);
new ClickListener() {

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.lang.ant.config.explorer;
import com.intellij.execution.ExecutionBundle;
@@ -28,8 +28,8 @@ import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.keymap.Keymap;
import com.intellij.openapi.keymap.KeymapManagerListener;
@@ -574,16 +574,7 @@ public final class AntExplorer extends SimpleToolWindowPanel implements Disposab
}
public static FileChooserDescriptor createXmlDescriptor() {
return new FileChooserDescriptor(true, false, false, false, false, true){
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
boolean b = super.isFileVisible(file, showHiddenFiles);
if (!file.isDirectory()) {
b &= FileTypeRegistry.getInstance().isFileOfType(file, XmlFileType.INSTANCE);
}
return b;
}
};
return FileChooserDescriptorFactory.createMultipleFilesNoJarsDescriptor().withExtensionFilter(XmlFileType.INSTANCE);
}
private static final class NodeRenderer extends ColoredTreeCellRenderer {
@@ -1026,4 +1017,4 @@ public final class AntExplorer extends SimpleToolWindowPanel implements Disposab
return VfsUtilCore.toVirtualFileArray(virtualFileList);
}
}
}
}

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2020 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.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.editorconfig.configmanagement.editor
import com.intellij.codeInsight.daemon.LineMarkerInfo
@@ -9,9 +9,8 @@ import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.DefaultActionGroup
import com.intellij.openapi.editor.markup.GutterIconRenderer
import com.intellij.openapi.fileChooser.FileChooserDescriptor
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.fileChooser.FileChooserFactory
import com.intellij.openapi.fileChooser.FileElement
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.project.DumbAwareAction
@@ -83,17 +82,14 @@ class EditorConfigPreviewMarkerProvider : LineMarkerProviderDescriptor(), DumbAw
fun getPattern(header: String): String = header.trimStart('[').trimEnd(']')
fun choosePreviewFile(project: Project, rootDir: VirtualFile, pattern: String): VirtualFile? {
val descriptor = object : FileChooserDescriptor(true, false, false, false, false, false) {
override fun isFileVisible(file: VirtualFile, showHiddenFiles: Boolean): Boolean =
(showHiddenFiles || !FileElement.isFileHidden(file))
&& Utils.EDITOR_CONFIG_FILE_NAME != file.name
&& file.length <= EditorConfigEditorProvider.MAX_PREVIEW_LENGTH
&& matchesPattern(rootDir, pattern, file.path)
|| file.isDirectory
override fun isFileSelectable(file: VirtualFile?): Boolean = file != null && !file.isDirectory
}.withRoots(rootDir)
descriptor.isForcedToUseIdeaFileChooser = true
val descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor()
.withFileFilter { file ->
Utils.EDITOR_CONFIG_FILE_NAME != file.name &&
file.length <= EditorConfigEditorProvider.MAX_PREVIEW_LENGTH &&
matchesPattern(rootDir, pattern, file.path)
}
.withRoots(rootDir)
.apply { isForcedToUseIdeaFileChooser = true }
val fileChooser = FileChooserFactory.getInstance().createFileChooser(descriptor, project, null)
val virtualFiles = fileChooser.choose(project, *VirtualFile.EMPTY_ARRAY)
return if (virtualFiles.isNotEmpty()) virtualFiles[0] else null
@@ -116,4 +112,4 @@ class EditorConfigPreviewMarkerProvider : LineMarkerProviderDescriptor(), DumbAw
FileEditorManager.getInstance(project).openFile(editorConfigFile, true)
}
}
}
}

View File

@@ -16,7 +16,6 @@ import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.ui.DialogPanel
import com.intellij.openapi.ui.TextFieldWithBrowseButton
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.ui.dsl.builder.*
import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes
import org.jetbrains.plugins.groovy.GroovyBundle
@@ -93,15 +92,11 @@ class GroovyCompilerConfigurable(private val project: Project) : BoundSearchable
private fun createExcludedConfigurable(project: Project): ExcludedEntriesConfigurable {
val configuration = config.excludeFromStubGeneration
val index = if (project.isDefault) null else ProjectRootManager.getInstance(project).fileIndex
val descriptor = object : FileChooserDescriptor(true, true, false, false, false, true) {
override fun isFileVisible(file: VirtualFile, showHiddenFiles: Boolean): Boolean {
return super.isFileVisible(file, showHiddenFiles) && (index == null || !index.isExcluded(file))
}
}
descriptor.roots = getInstance(project).modules.flatMap { module ->
ModuleRootManager.getInstance(module)
.getSourceRoots(JavaModuleSourceRootTypes.SOURCES)
}
val descriptor = FileChooserDescriptor(true, true, false, false, false, true)
.withFileFilter { file -> index == null || !index.isExcluded(file) }
.withRoots(getInstance(project).modules.flatMap { module ->
ModuleRootManager.getInstance(module).getSourceRoots(JavaModuleSourceRootTypes.SOURCES)
})
return ExcludedEntriesConfigurable(project, descriptor, configuration)
}
}

View File

@@ -1,18 +1,4 @@
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.idea.maven.project.actions
import com.intellij.openapi.actionSystem.AnActionEvent
@@ -20,9 +6,9 @@ import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.application.EDT
import com.intellij.openapi.fileChooser.FileChooser
import com.intellij.openapi.fileChooser.FileChooserDescriptor
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.ui.Messages
import com.intellij.openapi.ui.getPresentablePath
import com.intellij.openapi.vfs.VirtualFile
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -43,15 +29,8 @@ class AddManagedFilesAction : MavenAction() {
val project = MavenActionUtil.getProject(e.dataContext) ?: return
val manager = MavenProjectsManager.getInstanceIfCreated(project) ?: return
val singlePomSelection: FileChooserDescriptor = object : FileChooserDescriptor(true, true, false, false, false, false) {
override fun isFileSelectable(file: VirtualFile?): Boolean {
return super.isFileSelectable(file) && !manager.isManagedFile(file!!)
}
override fun isFileVisible(file: VirtualFile, showHiddenFiles: Boolean): Boolean {
return if (!file.isDirectory && !MavenActionUtil.isMavenProjectFile(file)) false else super.isFileVisible(file, showHiddenFiles)
}
}
val singlePomSelection: FileChooserDescriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor()
.withFileFilter { file -> MavenActionUtil.isMavenProjectFile(file) && !manager.isManagedFile(file) }
val files = withContext(Dispatchers.EDT) {
val fileToSelect = e.getData(CommonDataKeys.VIRTUAL_FILE)
@@ -79,4 +58,4 @@ class AddManagedFilesAction : MavenAction() {
}
}
}
}
}

View File

@@ -15,7 +15,6 @@ import com.intellij.ide.util.TreeClassChooserFactory;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.fileTypes.PlainTextLanguage;
import com.intellij.openapi.module.Module;
@@ -26,7 +25,6 @@ import com.intellij.openapi.ui.LabeledComponent;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.GlobalSearchScope;
@@ -414,13 +412,9 @@ public class TestNGConfigurationEditor<T extends TestNGConfiguration> extends Se
TextFieldWithBrowseButton textFieldWithBrowseButton = new TextFieldWithBrowseButton();
propertiesFile.setComponent(textFieldWithBrowseButton);
textFieldWithBrowseButton.addBrowseFolderListener(project, new FileChooserDescriptor(true, false, false, false, false, false) {
@Override
public boolean isFileVisible(VirtualFile virtualFile, boolean showHidden) {
if (!showHidden && virtualFile.getName().charAt(0) == '.') return false;
return virtualFile.isDirectory() || "properties".equals(virtualFile.getExtension());
}
}.withTitle(TestngBundle.message("testng.browse.button.title")).withDescription(TestngBundle.message("testng.select.properties.file")));
textFieldWithBrowseButton.addBrowseFolderListener(project, FileChooserDescriptorFactory.createSingleFileDescriptor("properties")
.withTitle(TestngBundle.message("testng.browse.button.title"))
.withDescription(TestngBundle.message("testng.select.properties.file")));
propertiesTableView = new TableView(propertiesTableModel);

View File

@@ -1,49 +1,28 @@
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.theoryinpractice.testng.configuration.browser;
import com.intellij.execution.configuration.BrowseModuleValueActionListener;
import com.intellij.ide.IdeCoreBundle;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.theoryinpractice.testng.TestngBundle;
/**
* @author Hani Suleiman
*/
public class SuiteBrowser extends BrowseModuleValueActionListener
{
public SuiteBrowser(Project project) {
super(project);
}
@Override
public String showDialog() {
FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) {
@Override
public boolean isFileVisible(VirtualFile virtualFile, boolean showHidden) {
if(!showHidden && virtualFile.getName().charAt(0) == '.') return false;
return virtualFile.isDirectory() || "xml".equals(virtualFile.getExtension()) || "yaml".equals(virtualFile.getExtension());
}
};
descriptor.setDescription((TestngBundle.message("testng.suite.browser.select.xml.or.yaml.suite.file")));
descriptor.setTitle(TestngBundle.message("testng.suite.browser.select.suite"));
VirtualFile file = FileChooser.chooseFile(descriptor, getProject(), null);
return file != null ? file.getPath() : null;
}
public class SuiteBrowser extends BrowseModuleValueActionListener {
public SuiteBrowser(Project project) {
super(project);
}
@Override
public String showDialog() {
var descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor()
.withExtensionFilter(IdeCoreBundle.message("file.chooser.files.label", "XML|YAML"), "xml", "yaml")
.withTitle(TestngBundle.message("testng.suite.browser.select.suite"))
.withDescription((TestngBundle.message("testng.suite.browser.select.xml.or.yaml.suite.file")));
var file = FileChooser.chooseFile(descriptor, getProject(), null);
return file != null ? file.getPath() : null;
}
}

View File

@@ -16,18 +16,17 @@
package org.intellij.lang.xpath.xslt.associations.impl;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.ide.IdeCoreBundle;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.psi.PsiFile;
import com.intellij.util.IconUtil;
import org.intellij.lang.xpath.xslt.associations.FileAssociationsManager;
import org.intellij.plugins.xpathView.XPathBundle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
class AddAssociationAction extends AnAction {
private final FileAssociationsManager myManager;
@@ -54,20 +53,15 @@ class AddAssociationAction extends AnAction {
}
protected void addAssociation(final PsiFile psiFile) {
final VirtualFile virtualFile = psiFile.getVirtualFile();
var virtualFile = psiFile.getVirtualFile();
assert virtualFile != null;
final FileChooserDescriptor descriptor = new AnyXMLDescriptor(true) {
@Override
public boolean isFileSelectable(@Nullable VirtualFile file) {
return super.isFileSelectable(file) && !file.equals(virtualFile);
}
};
var descriptor = FileChooserDescriptorFactory.createMultipleFilesNoJarsDescriptor()
.withExtensionFilter(IdeCoreBundle.message("file.chooser.files.label", "XML"), FileAssociationsManager.Holder.XML_FILES)
.withFileFilter(file -> !file.equals(virtualFile));
final VirtualFile[] virtualFiles = FileChooser.chooseFiles(descriptor, psiFile.getProject(), psiFile.getVirtualFile());
for (VirtualFile file : virtualFiles) {
var virtualFiles = FileChooser.chooseFiles(descriptor, psiFile.getProject(), psiFile.getVirtualFile());
for (var file : virtualFiles) {
assert !virtualFile.equals(file);
myManager.addAssociation(psiFile, file);
}

View File

@@ -15,24 +15,19 @@
*/
package org.intellij.lang.xpath.xslt.associations.impl;
import com.intellij.ide.IdeCoreBundle;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.vfs.VirtualFile;
import org.intellij.lang.xpath.xslt.associations.FileAssociationsManager;
/**
* @deprecated use {@link com.intellij.openapi.fileChooser.FileChooserDescriptorFactory}
* along with {@link FileChooserDescriptor#withExtensionFilter(String, FileType...)}.
*/
@Deprecated(forRemoval = true)
public class AnyXMLDescriptor extends FileChooserDescriptor {
final FileTypeManager myFileTypeManager;
public AnyXMLDescriptor(boolean chooseMultiple) {
super(true, false, false, false, false, chooseMultiple);
myFileTypeManager = FileTypeManager.getInstance();
}
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
final FileType fileType = file.getFileType();
return file.isDirectory() || (super.isFileVisible(file, showHiddenFiles)
&& FileAssociationsManager.Holder.XML_FILES_LIST.contains(fileType));
withExtensionFilter(IdeCoreBundle.message("file.chooser.files.label", "XML"), FileAssociationsManager.Holder.XML_FILES);
}
}

View File

@@ -17,9 +17,11 @@ package org.intellij.lang.xpath.xslt.run;
import com.intellij.execution.impl.CheckableRunConfigurationEditor;
import com.intellij.icons.AllIcons;
import com.intellij.ide.IdeCoreBundle;
import com.intellij.ide.highlighter.ModuleFileType;
import com.intellij.ide.highlighter.ProjectFileType;
import com.intellij.ide.highlighter.WorkspaceFileType;
import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.application.WriteAction;
@@ -59,7 +61,6 @@ import com.intellij.util.ui.PlatformColors;
import com.intellij.util.ui.UIUtil;
import org.intellij.lang.xpath.xslt.XsltSupport;
import org.intellij.lang.xpath.xslt.associations.FileAssociationsManager;
import org.intellij.lang.xpath.xslt.associations.impl.AnyXMLDescriptor;
import org.intellij.plugins.xpathView.XPathBundle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -123,21 +124,15 @@ class XsltRunSettingsEditor extends SettingsEditor<XsltRunConfiguration>
private final FileChooserDescriptor myXmlDescriptor;
private final FileChooserDescriptor myXsltDescriptor;
Editor(final Project project) {
final PsiManager psiManager = PsiManager.getInstance(project);
Editor(Project project) {
var psiManager = PsiManager.getInstance(project);
myXsltDescriptor = FileChooserDescriptorFactory.createSingleFileDescriptor(XmlFileType.INSTANCE)
.withFileFilter(file -> {
var psiFile = psiManager.findFile(file);
return psiFile != null && XsltSupport.isXsltFile(psiFile);
})
.withTitle(XPathBundle.message("dialog.title.choose.xslt.file"));
myXsltDescriptor = new FileChooserDescriptor(true, false, false, false, false, false) {
@Override
public boolean isFileVisible(final VirtualFile file, boolean showHiddenFiles) {
if (file.isDirectory()) return true;
if (!super.isFileVisible(file, showHiddenFiles)) return false;
return ReadAction.compute(() -> {
final PsiFile psiFile = psiManager.findFile(file);
return psiFile != null && XsltSupport.isXsltFile(psiFile);
});
}
}.withTitle(XPathBundle.message("dialog.title.choose.xslt.file"));
final TextComponentAccessor<JTextField> projectDefaultAccessor = new TextComponentAccessor<>() {
@Override
public String getText(JTextField component) {
@@ -195,7 +190,9 @@ class XsltRunSettingsEditor extends SettingsEditor<XsltRunConfiguration>
myXmlInputFile.getComboBox().setEditable(true);
myXmlDescriptor = new AnyXMLDescriptor(false).withTitle(XPathBundle.message("dialog.title.choose.xml.file"));
myXmlDescriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor()
.withExtensionFilter(IdeCoreBundle.message("file.chooser.files.label", "XML"), FileAssociationsManager.Holder.XML_FILES)
.withTitle(XPathBundle.message("dialog.title.choose.xml.file"));
myXmlInputFile.addBrowseFolderListener(project, myXmlDescriptor, new TextComponentAccessor<>() {
@Override
public String getText(JComboBox comboBox) {

View File

@@ -140,26 +140,9 @@ public final class PythonSdkType extends SdkType {
}
}
}
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
// TODO: add a better, customizable filtering
if (!file.isDirectory()) {
if (isLocatedInLocalWindowsFS(file)) {
String path = file.getPath();
boolean looksExecutable = false;
for (String ext : PythonSdkUtil.WINDOWS_EXECUTABLE_SUFFIXES) {
if (path.endsWith(ext)) {
looksExecutable = true;
break;
}
}
return looksExecutable && super.isFileVisible(file, showHiddenFiles);
}
}
return super.isFileVisible(file, showHiddenFiles);
}
}.withTitle(PyBundle.message("sdk.select.path")).withShowHiddenFiles(SystemInfo.isUnix);
}
.withTitle(PyBundle.message("sdk.select.path"))
.withShowHiddenFiles(SystemInfo.isUnix);
// XXX: Workaround for PY-21787 and PY-43507 since the native macOS dialog always follows symlinks
if (SystemInfo.isMac) {
@@ -169,10 +152,6 @@ public final class PythonSdkType extends SdkType {
return descriptor;
}
private static boolean isLocatedInLocalWindowsFS(@NotNull VirtualFile file) {
return SystemInfo.isWindows && !isCustomPythonSdkHomePath(file.getPath());
}
private static boolean isLocatedInWsl(@NotNull VirtualFile file) {
return SystemInfo.isWindows && isCustomPythonSdkHomePath(file.getPath());
}

View File

@@ -6,6 +6,7 @@ import com.intellij.execution.target.LanguageRuntimeType
import com.intellij.execution.target.TargetEnvironmentConfiguration
import com.intellij.execution.target.local.LocalTargetEnvironmentRequest
import com.intellij.openapi.fileChooser.FileChooserDescriptor
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.observable.properties.GraphProperty
import com.intellij.openapi.observable.properties.ObservableMutableProperty
import com.intellij.openapi.observable.properties.ObservableProperty
@@ -13,17 +14,10 @@ import com.intellij.openapi.observable.properties.PropertyGraph
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.ui.validation.validationErrorIf
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.util.progress.RawProgressReporter
import com.jetbrains.python.PyBundle
import com.jetbrains.python.psi.LanguageLevel
import com.jetbrains.python.sdk.conda.IntrospectableCommandExecutor
import com.jetbrains.python.sdk.conda.TargetCommandExecutor
import com.jetbrains.python.sdk.conda.TargetEnvironmentRequestCommandExecutor
import com.jetbrains.python.sdk.conda.condaSupportedLanguages
import com.jetbrains.python.sdk.conda.createCondaSdkAlongWithNewEnv
import com.jetbrains.python.sdk.conda.createCondaSdkFromExistingEnv
import com.jetbrains.python.sdk.conda.suggestCondaPath
import com.jetbrains.python.sdk.conda.*
import com.jetbrains.python.sdk.flavors.conda.NewCondaEnvRequest
import com.jetbrains.python.sdk.flavors.conda.PyCondaCommand
import com.jetbrains.python.sdk.flavors.conda.PyCondaEnv
@@ -57,10 +51,7 @@ class PyAddCondaPanelModel(val targetConfiguration: TargetEnvironmentConfigurati
val languageLevels: List<LanguageLevel> = condaSupportedLanguages
val condaPathFileChooser: FileChooserDescriptor
get() = object : FileChooserDescriptor(true, false, false, false, false, false) {
override fun isFileVisible(file: VirtualFile?, showHiddenFiles: Boolean): Boolean =
super.isFileVisible(file, showHiddenFiles) && (file?.let { it.isDirectory || condaPathIsValid(it.path) } != false)
}
get() = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor().withFileFilter { condaPathIsValid(it.path) }
/**
* If target is mutable we can create new env on it

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.xml.util;
import com.intellij.codeInspection.InspectionProfile;
@@ -15,6 +15,7 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.XmlTypedHandlersAdditionalSupport;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.openapi.util.Ref;
@@ -707,13 +708,17 @@ public final class HtmlUtil {
}
public static boolean isHtmlFile(@NotNull PsiElement element) {
Language language = element.getLanguage();
var language = element.getLanguage();
return language.isKindOf(HTMLLanguage.INSTANCE) || language.isKindOf(XHTMLLanguage.INSTANCE);
}
public static boolean isHtmlFile(@NotNull VirtualFile file) {
FileType fileType = file.getFileType();
return fileType == HtmlFileType.INSTANCE || fileType == XHtmlFileType.INSTANCE;
var registry = FileTypeRegistry.getInstance();
return registry.isFileOfType(file, HtmlFileType.INSTANCE) || registry.isFileOfType(file, XHtmlFileType.INSTANCE);
}
public static FileType @NotNull [] getHtmlFileTypes() {
return new FileType[]{HtmlFileType.INSTANCE, XHtmlFileType.INSTANCE};
}
public static boolean isHtmlTagContainingFile(PsiElement element) {

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.xml.tools;
@@ -54,8 +54,7 @@ final class GenerateInstanceDocumentFromSchemaDialog extends DialogWrapper {
super(project, true);
myProject = project;
UIUtils
.configureBrowseButton(project, generateFromUrl, new String[]{"xsd"}, XmlBundle.message("select.xsd.schema.dialog.title"), false);
UIUtils.configureBrowseButton(project, generateFromUrl, "xsd", XmlBundle.message("select.xsd.schema.dialog.title"), false);
doInitFor(rootElementChooserText, rootElementChooser);
doInitFor(generateFromUrlText, generateFromUrl.getTextField());

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.xml.tools;
import com.intellij.codeInspection.util.InspectionMessage;
@@ -69,7 +69,7 @@ final class GenerateSchemaFromInstanceDocumentDialog extends DialogWrapper {
detectEnumerationsLimit.setText("10");
UIUtils.configureBrowseButton(project, generateFromUrl, new String[] {"xml"}, XmlBundle.message("select.xml.document.dialog.title"), false);
UIUtils.configureBrowseButton(project, generateFromUrl, "xml", XmlBundle.message("select.xml.document.dialog.title"), false);
doInitFor(generateFromUrlText, generateFromUrl.getTextField());
doInitFor(resultSchemaFileNameText, resultSchemaFileName);

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.xml.tools;
import com.intellij.javaee.ExternalResourceManager;
@@ -10,57 +10,38 @@ import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.NlsContexts.DialogTitle;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.xml.XmlBundle;
import org.jetbrains.annotations.Nullable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.List;
/**
* @author Konstantin Bulenkov
*/
final class UIUtils {
private UIUtils() {}
public static void configureBrowseButton(final Project myProject,
final TextFieldWithBrowseButton wsdlUrl,
final String[] _extensions,
final @DialogTitle String selectFileDialogTitle,
final boolean multipleFileSelection) {
public static void configureBrowseButton(
Project myProject,
TextFieldWithBrowseButton wsdlUrl,
String extension,
@DialogTitle String selectFileDialogTitle,
boolean multipleFileSelection
) {
wsdlUrl.getButton().setToolTipText(XmlBundle.message("browse.button.tooltip"));
wsdlUrl.getButton().addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
final FileChooserDescriptor fileChooserDescriptor = new FileChooserDescriptor(true, false, false, false, false, multipleFileSelection) {
private final List<String> extensions = Arrays.asList(_extensions);
var fileChooserDescriptor = new FileChooserDescriptor(true, false, false, false, false, multipleFileSelection)
.withExtensionFilter(extension)
.withTitle(selectFileDialogTitle);
@Override
public boolean isFileSelectable(@Nullable VirtualFile virtualFile) {
if (virtualFile == null) return false;
return extensions.contains(virtualFile.getExtension());
}
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
return super.isFileVisible(file, showHiddenFiles) && (file.isDirectory() || isFileSelectable(file));
}
};
fileChooserDescriptor.setTitle(selectFileDialogTitle);
VirtualFile initialFile = ProjectUtil.guessProjectDir(myProject);
String selectedItem = wsdlUrl.getTextField().getText();
var initialFile = ProjectUtil.guessProjectDir(myProject);
var selectedItem = wsdlUrl.getTextField().getText();
if (selectedItem != null && selectedItem.startsWith(LocalFileSystem.PROTOCOL_PREFIX)) {
VirtualFile fileByPath = VfsUtilCore
.findRelativeFile(ExternalResourceManager.getInstance().getResourceLocation(VfsUtilCore.fixURLforIDEA(selectedItem)), null);
var fileByPath = VfsUtilCore.findRelativeFile(ExternalResourceManager.getInstance().getResourceLocation(VfsUtilCore.fixURLforIDEA(selectedItem)), null);
if (fileByPath != null) initialFile = fileByPath;
}
final VirtualFile[] virtualFiles = FileChooser.chooseFiles(fileChooserDescriptor, myProject, initialFile);
var virtualFiles = FileChooser.chooseFiles(fileChooserDescriptor, myProject, initialFile);
if (virtualFiles.length == 1) {
String url = VfsUtilCore.fixIDEAUrl(virtualFiles[0].getUrl());
wsdlUrl.setText(url);