From c954cb746f1a26034223263cf6488b2e2109dde9 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 26 Sep 2024 17:48:09 +0200 Subject: [PATCH] [platform] migrating platform choosers to extension-based filters (IJPL-150176) GitOrigin-RevId: 72b4a6f4c258d4235349c16a87b2d03d78168c4f --- .../editor/actions/BackgroundImageDialog.java | 4 +- .../src/ChooseComponentsToExportDialog.kt | 7 ++-- .../src/ImportSettingsAction.kt | 4 +- .../src/PasswordSafeConfigurable.kt | 8 ++-- .../actions/ViewOfflineResultsAction.java | 16 ++------ .../debugger/extensions/PlaybackDebugger.java | 25 +++++------- .../resources/messages/IdeBundle.properties | 2 + .../certificates/PluginCertificateManager.kt | 14 ++----- .../ui/customization/BrowseIconsComboBox.kt | 8 ++-- .../ide/wizard/NewProjectWizardBaseStep.kt | 3 +- .../application/ConfigImportHelper.java | 9 ++--- .../application/ImportOldConfigsPanel.java | 15 +++---- .../openapi/options/SchemeImportUtil.java | 39 ++++++++----------- .../projectActions/ChangeProjectIconAction.kt | 9 ++--- .../util/net/ssl/CertificateConfigurable.java | 20 ++++------ .../messages/BootstrapBundle.properties | 1 + .../ide/util/DumpInvalidTipsActions.kt | 7 ++-- .../src/com/intellij/ide/util/TipDialog.java | 9 +++-- .../intelliLang/InjectionsSettingsUI.java | 24 +++--------- 19 files changed, 83 insertions(+), 141 deletions(-) diff --git a/images/src/org/intellij/images/editor/actions/BackgroundImageDialog.java b/images/src/org/intellij/images/editor/actions/BackgroundImageDialog.java index 6fafb5a03798..854644c59f30 100644 --- a/images/src/org/intellij/images/editor/actions/BackgroundImageDialog.java +++ b/images/src/org/intellij/images/editor/actions/BackgroundImageDialog.java @@ -219,8 +219,8 @@ public class BackgroundImageDialog extends DialogWrapper { initFillPanel(myFillPanel, myFillGroup, getDisposable()); ((CardLayout)myPreviewPanel.getLayout()).show(myPreviewPanel, EDITOR); myPathField.getComboBox().setEditable(true); - FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, true, false) - .withFileFilter(file -> ImageFileTypeManager.getInstance().isImage(file)); + var descriptor = new FileChooserDescriptor(true, false, false, false, true, false) + .withExtensionFilter(ImageFileTypeManager.getInstance().getImageFileType()); myPathField.addBrowseFolderListener(null, descriptor, TextComponentAccessor.STRING_COMBOBOX_WHOLE_TEXT); JTextComponent textComponent = getComboEditor(); textComponent.getDocument().addDocumentListener(new DocumentAdapter() { diff --git a/platform/configuration-store-impl/src/ChooseComponentsToExportDialog.kt b/platform/configuration-store-impl/src/ChooseComponentsToExportDialog.kt index 55076e6e6b3a..59d18853db4e 100644 --- a/platform/configuration-store-impl/src/ChooseComponentsToExportDialog.kt +++ b/platform/configuration-store-impl/src/ChooseComponentsToExportDialog.kt @@ -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.configurationStore import com.intellij.ide.util.ElementsChooser @@ -22,7 +22,6 @@ import java.awt.event.ActionEvent import java.io.File import java.nio.file.Path import java.nio.file.Paths -import java.util.* import javax.swing.* private const val DEFAULT_FILE_NAME = "settings.zip" @@ -137,7 +136,7 @@ internal class ChooseComponentsToExportDialog(fileToComponents: Map val path = if (file.isDirectory) "${file.path}/$DEFAULT_FILE_NAME" else file.path @@ -217,4 +216,4 @@ private class ComponentElementProperties : MultiStateElementsChooser.ElementProp } return names.joinToString(", ") } -} \ No newline at end of file +} diff --git a/platform/configuration-store-impl/src/ImportSettingsAction.kt b/platform/configuration-store-impl/src/ImportSettingsAction.kt index eb1bbc3cc2b1..475b1552940b 100644 --- a/platform/configuration-store-impl/src/ImportSettingsAction.kt +++ b/platform/configuration-store-impl/src/ImportSettingsAction.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. 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.configurationStore import com.intellij.ide.IdeBundle @@ -58,7 +58,7 @@ open class ImportSettingsAction : AnAction(), ActionRemoteBehaviorSpecification. title = ConfigurationStoreBundle.message("title.import.file.location") description = ConfigurationStoreBundle.message("prompt.choose.import.file.path") isHideIgnored = false - withFileFilter { ConfigImportHelper.isSettingsFile(it) } + ConfigImportHelper.setSettingsFilter(this) } chooseSettingsFile(descriptor, PathManager.getOriginalConfigDir().pathString, component) { diff --git a/platform/credential-store-ui/src/PasswordSafeConfigurable.kt b/platform/credential-store-ui/src/PasswordSafeConfigurable.kt index b430b7442d7a..a1f6a2280482 100644 --- a/platform/credential-store-ui/src/PasswordSafeConfigurable.kt +++ b/platform/credential-store-ui/src/PasswordSafeConfigurable.kt @@ -212,7 +212,7 @@ class PasswordSafeConfigurableUi(private val settings: PasswordSafeSettings) : C row(CredentialStoreBundle.message("settings.password.database")) { val fileChooserDescriptor = FileChooserDescriptorFactory.createSingleLocalFileDescriptor() .withTitle(CredentialStoreBundle.message("passwordSafeConfigurable.keepass.database.file")) - .withFileFilter { it.isDirectory || it.name.endsWith(".kdbx") } + .withExtensionFilter("kdbx") keePassDbFile = textFieldWithBrowseButton(fileChooserDescriptor, fileChosen = { val path = when { it.isDirectory -> "${it.path}${File.separator}$DB_FILE_NAME" @@ -310,10 +310,8 @@ class PasswordSafeConfigurableUi(private val settings: PasswordSafeSettings) : C override fun actionPerformed(event: AnActionEvent) { closeCurrentStore() - FileChooserDescriptorFactory.createSingleLocalFileDescriptor() - .withFileFilter { - !it.isDirectory && it.nameSequence.endsWith(".kdbx") - } + FileChooserDescriptorFactory.createSingleFileDescriptor() + .withExtensionFilter("kdbx") .chooseFile(event) { createKeePassFileManager()?.import(Paths.get(it.path), event) } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/ViewOfflineResultsAction.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/ViewOfflineResultsAction.java index 5cb8d90ad161..f4bbfa681922 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/actions/ViewOfflineResultsAction.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/ViewOfflineResultsAction.java @@ -14,13 +14,12 @@ import com.intellij.codeInspection.offlineViewer.OfflineInspectionRVContentProvi import com.intellij.codeInspection.offlineViewer.OfflineViewParseUtil; import com.intellij.codeInspection.reference.RefManagerImpl; import com.intellij.codeInspection.ui.InspectionResultsView; -import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileChooser.FileChooser; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; @@ -39,7 +38,6 @@ import com.intellij.util.ExceptionUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; import java.nio.file.Path; import java.util.*; @@ -65,16 +63,8 @@ public final class ViewOfflineResultsAction extends AnAction { LOG.assertTrue(project != null); - final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, false, false, false, false){ - @Override - public Icon getIcon(VirtualFile file) { - if (file.isDirectory() && - file.findChild(InspectionsResultUtil.DESCRIPTIONS + "." + StdFileTypes.XML.getDefaultExtension()) != null) { - return AllIcons.Nodes.InspectionResults; - } - return super.getIcon(file); - } - }.withFileFilter(f -> f.isDirectory() || StdFileTypes.XML.getDefaultExtension().equals(f.getExtension())) + var descriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor() + .withExtensionFilter("xml") .withTitle(InspectionsBundle.message("view.offline.inspections.select.path.title")) .withDescription(InspectionsBundle.message("view.offline.inspections.select.path.description")); final VirtualFile virtualFile = FileChooser.chooseFile(descriptor, project, null); diff --git a/platform/lang-impl/src/com/intellij/ui/debugger/extensions/PlaybackDebugger.java b/platform/lang-impl/src/com/intellij/ui/debugger/extensions/PlaybackDebugger.java index 7e7e2876e3d5..e1a170b0d09d 100644 --- a/platform/lang-impl/src/com/intellij/ui/debugger/extensions/PlaybackDebugger.java +++ b/platform/lang-impl/src/com/intellij/ui/debugger/extensions/PlaybackDebugger.java @@ -11,7 +11,6 @@ import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; -import com.intellij.openapi.fileChooser.FileElement; import com.intellij.openapi.fileChooser.ex.FileChooserKeys; import com.intellij.openapi.fileEditor.impl.LoadTextUtil; import com.intellij.openapi.ui.Messages; @@ -151,6 +150,15 @@ public final class PlaybackDebugger implements UiDebuggerExtension, PlaybackRunn LocalFileSystem.getInstance().addVirtualFileListener(myVfsListener); } + private static final class ScriptFileChooserDescriptor extends FileChooserDescriptor { + ScriptFileChooserDescriptor() { + super(true, false, false, false, false, false); + putUserData(FileChooserKeys.NEW_FILE_TYPE, UiScriptFileType.getInstance()); + putUserData(FileChooserKeys.NEW_FILE_TEMPLATE_TEXT, ""); + withExtensionFilter(UiScriptFileType.myExtension); + } + } + private final class SaveAction extends AnAction { SaveAction() { super(IdeBundle.messagePointer("action.AnAction.text.save"), @@ -186,21 +194,6 @@ public final class PlaybackDebugger implements UiDebuggerExtension, PlaybackRunn } } - private static final class ScriptFileChooserDescriptor extends FileChooserDescriptor { - ScriptFileChooserDescriptor() { - super(true, false, false, false, false, false); - putUserData(FileChooserKeys.NEW_FILE_TYPE, UiScriptFileType.getInstance()); - putUserData(FileChooserKeys.NEW_FILE_TEMPLATE_TEXT, ""); - } - - @Override - public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) { - if (!showHiddenFiles && FileElement.isFileHidden(file)) return false; - return file.getExtension() != null && file.getExtension().equalsIgnoreCase(UiScriptFileType.myExtension) - || super.isFileVisible(file, showHiddenFiles) && file.isDirectory(); - } - } - private final class SetScriptFileAction extends AnAction { SetScriptFileAction() { //noinspection DialogTitleCapitalization diff --git a/platform/platform-api/resources/messages/IdeBundle.properties b/platform/platform-api/resources/messages/IdeBundle.properties index 35f0f961af92..361cc279605b 100644 --- a/platform/platform-api/resources/messages/IdeBundle.properties +++ b/platform/platform-api/resources/messages/IdeBundle.properties @@ -605,6 +605,7 @@ macOS.light.theme.name=macOS Light title.browse.icon=Browse Icon prompt.browse.icon.for.selected.action=Browse icon in SVG or PNG format browse.custom.icon.hint=To set custom icon, specify path to SVG or PNG file. +icon.file.filter.label=Icon files icon.validation.message.format=The icon format is incorrect icon.validation.message.not.found=The icon does not exist @@ -1314,6 +1315,7 @@ settings.certificate.accept.non.trusted.certificates.automatically=Accept non-tr settings.certificate.no.certificate.selected=No certificate selected settings.certificate.no.certificates=No certificates settings.certificate.choose.certificate=Choose Certificate +settings.certificate.filter.label=Certificate files settings.certificate.malformed.x509.server.certificate=Malformed X509 server certificate settings.certificate.not.imported=Not Imported settings.certificate.certificate.already.exists=Certificate already exists diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/certificates/PluginCertificateManager.kt b/platform/platform-impl/src/com/intellij/ide/plugins/certificates/PluginCertificateManager.kt index f15b829d4158..3a9e531f2d93 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/certificates/PluginCertificateManager.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/certificates/PluginCertificateManager.kt @@ -1,9 +1,8 @@ -// Copyright 2000-2021 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.plugins.certificates import com.intellij.ide.IdeBundle import com.intellij.openapi.fileChooser.FileChooser -import com.intellij.openapi.fileChooser.FileTypeDescriptor import com.intellij.openapi.options.BoundConfigurable import com.intellij.openapi.options.Configurable import com.intellij.openapi.options.ConfigurationException @@ -59,13 +58,6 @@ class PluginCertificateManager : } } - private val CERTIFICATE_DESCRIPTOR = FileTypeDescriptor( - IdeBundle.message("settings.certificate.choose.certificate"), - ".crt", ".CRT", - ".cer", ".CER", - ".pem", ".PEM", - ".der", ".DER" - ) private val EMPTY_PANEL = "empty.panel" private val myTrustManager: MutableTrustManager = PluginCertificateStore.customTrustManager private val myTreeBuilder: CertificateTreeBuilder = CertificateTreeBuilder(myTree) @@ -164,7 +156,7 @@ class PluginCertificateManager : } private fun chooseFileAndAdd() { - FileChooser.chooseFile(CERTIFICATE_DESCRIPTOR, null, null) { file: VirtualFile -> + FileChooser.chooseFile(CertificateConfigurable.CERTIFICATE_DESCRIPTOR, null, null) { file: VirtualFile -> val path = file.path val certificate = CertificateUtil.loadX509Certificate(path) when { @@ -222,4 +214,4 @@ class PluginCertificateManager : myDetailsPanel.add(scrollPane, uniqueName) } -} \ No newline at end of file +} diff --git a/platform/platform-impl/src/com/intellij/ide/ui/customization/BrowseIconsComboBox.kt b/platform/platform-impl/src/com/intellij/ide/ui/customization/BrowseIconsComboBox.kt index db7baad8e47f..a94849720866 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/customization/BrowseIconsComboBox.kt +++ b/platform/platform-impl/src/com/intellij/ide/ui/customization/BrowseIconsComboBox.kt @@ -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.ide.ui.customization import com.intellij.icons.AllIcons @@ -196,9 +196,7 @@ internal class BrowseIconsComboBox(private val customActionsSchema: CustomAction private fun browseIconAndSelect() { val descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor() - .withFileFilter { file -> - StringUtil.equalsIgnoreCase(file.extension, "svg") || StringUtil.equalsIgnoreCase(file.extension, "png") - } + .withExtensionFilter(IdeBundle.message("icon.file.filter.label"), "svg", "png") descriptor.title = IdeBundle.message("title.browse.icon") descriptor.description = IdeBundle.message("prompt.browse.icon.for.selected.action") val iconFile = FileChooser.chooseFile(descriptor, null, null) @@ -330,4 +328,4 @@ internal class BrowseIconsComboBox(private val customActionsSchema: CustomAction return cur } } -} \ No newline at end of file +} diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardBaseStep.kt b/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardBaseStep.kt index cbf90de2add6..aa194cc55a69 100644 --- a/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardBaseStep.kt +++ b/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardBaseStep.kt @@ -112,9 +112,8 @@ class NewProjectWizardBaseStep(parent: NewProjectWizardStep) : AbstractNewProjec }.bottomGap(BottomGap.SMALL) val locationRow = row(UIBundle.message("label.project.wizard.new.project.location")) { - val fileChooserDescriptor = FileChooserDescriptorFactory.createSingleLocalFileDescriptor() + val fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor() .withTitle(message("title.select.project.file.directory", context.presentationName)) - .withFileFilter { it.isDirectory } .withPathToTextConvertor(::getPresentablePath) .withTextToPathConvertor(::getCanonicalPath) textFieldWithBrowseButton(fileChooserDescriptor, context.project) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java index deabfc18f708..af88d43b223f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java @@ -6,7 +6,6 @@ import com.intellij.diagnostic.VMOptions; import com.intellij.ide.BootstrapBundle; import com.intellij.ide.GeneralSettings; import com.intellij.ide.actions.ImportSettingsFilenameFilter; -import com.intellij.ide.highlighter.ArchiveFileType; import com.intellij.ide.plugins.*; import com.intellij.ide.plugins.marketplace.MarketplacePluginDownloadService; import com.intellij.ide.startup.StartupActionScriptManager; @@ -19,7 +18,7 @@ import com.intellij.openapi.application.migrations.PythonProMigration242; import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.PluginId; -import com.intellij.openapi.fileTypes.FileTypeRegistry; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.keymap.impl.KeymapManagerImpl; import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.progress.ProcessCanceledException; @@ -37,7 +36,6 @@ import com.intellij.openapi.util.registry.EarlyAccessRegistryManager; import com.intellij.openapi.util.text.NaturalComparator; import com.intellij.openapi.util.text.StringUtilRt; import com.intellij.openapi.util.text.Strings; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.platform.ide.bootstrap.IdeStartupWizardKt; import com.intellij.platform.ide.bootstrap.StartupErrorReporter; import com.intellij.ui.AppUIUtilKt; @@ -480,9 +478,8 @@ public final class ConfigImportHelper { return isFirstSession() && !isConfigImported(); } - /** Simple check by file type, content is not checked. */ - public static boolean isSettingsFile(@NotNull VirtualFile file) { - return FileTypeRegistry.getInstance().isFileOfType(file, ArchiveFileType.INSTANCE); + public static void setSettingsFilter(@NotNull FileChooserDescriptor descriptor) { + descriptor.withExtensionFilter(BootstrapBundle.message("import.settings.filter"), "zip", "jar"); } public static void setConfigImportedInThisSession() { diff --git a/platform/platform-impl/src/com/intellij/openapi/application/ImportOldConfigsPanel.java b/platform/platform-impl/src/com/intellij/openapi/application/ImportOldConfigsPanel.java index c0b0e216a452..b14067041ce6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/ImportOldConfigsPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/ImportOldConfigsPanel.java @@ -1,11 +1,9 @@ -// 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.openapi.application; import com.intellij.ide.BootstrapBundle; import com.intellij.openapi.MnemonicHelper; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; -import com.intellij.openapi.fileChooser.PathChooserDialog; import com.intellij.openapi.fileChooser.impl.FileChooserFactoryImpl; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.TextFieldWithBrowseButton; @@ -94,11 +92,10 @@ final class ImportOldConfigsPanel extends JDialog { } myPrevInstallation.setTextFieldPreferredWidth(50); myPrevInstallation.addActionListener(e -> { - FileChooserDescriptor chooserDescriptor = FileChooserDescriptorFactory.createSingleLocalFileDescriptor(); - chooserDescriptor.setHideIgnored(false); - chooserDescriptor.withFileFilter(file -> file.isDirectory() || ConfigImportHelper.isSettingsFile(file)); - Ref fileRef = Ref.create(); - PathChooserDialog chooser = FileChooserFactoryImpl.createNativePathChooserIfEnabled(chooserDescriptor, null, myRootPanel); + var chooserDescriptor = FileChooserDescriptorFactory.createSingleLocalFileDescriptor().withHideIgnored(false); + ConfigImportHelper.setSettingsFilter(chooserDescriptor); + var fileRef = Ref.create(); + var chooser = FileChooserFactoryImpl.createNativePathChooserIfEnabled(chooserDescriptor, null, myRootPanel); if (chooser != null) { VirtualFile vf = myLastSelection != null ? new CoreLocalVirtualFile(new CoreLocalFileSystem(), myLastSelection) : null; chooser.choose(vf, files -> fileRef.set(new File(files.get(0).getPresentableUrl()))); @@ -108,7 +105,7 @@ final class ImportOldConfigsPanel extends JDialog { fc.setSelectedFile(myLastSelection != null ? myLastSelection.toFile() : null); fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); fc.setFileHidingEnabled(SystemInfo.isWindows || SystemInfo.isMac); - fc.setFileFilter(new FileNameExtensionFilter("settings file", "zip", "jar")); + fc.setFileFilter(new FileNameExtensionFilter(BootstrapBundle.message("import.settings.filter"), "zip", "jar")); @SuppressWarnings("DuplicatedCode") int returnVal = fc.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { diff --git a/platform/platform-impl/src/com/intellij/openapi/options/SchemeImportUtil.java b/platform/platform-impl/src/com/intellij/openapi/options/SchemeImportUtil.java index 08540eabd92b..dd6bf02842bd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/SchemeImportUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/SchemeImportUtil.java @@ -1,10 +1,9 @@ -// 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.openapi.options; +import com.intellij.ide.IdeCoreBundle; import com.intellij.openapi.fileChooser.FileChooserDescriptor; -import com.intellij.openapi.fileChooser.FileChooserDialog; import com.intellij.openapi.fileChooser.FileChooserFactory; -import com.intellij.openapi.fileChooser.FileElement; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.NlsContexts; import com.intellij.openapi.vfs.VirtualFile; @@ -16,28 +15,22 @@ import org.jetbrains.annotations.Nullable; import java.awt.*; import java.io.IOException; -import java.io.InputStream; -import java.util.Set; +import java.util.Locale; public final class SchemeImportUtil { - public static @Nullable VirtualFile selectImportSource(final String @NotNull [] sourceExtensions, - @NotNull Component parent, - @Nullable VirtualFile preselect, - @Nullable @NlsContexts.Label String description) { - final Set extensions = Set.of(sourceExtensions); - FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, canSelectJarFile(sourceExtensions), false, false, false) { - @Override - public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) { - return - (file.isDirectory() || isFileSelectable(file)) && - (showHiddenFiles || !FileElement.isFileHidden(file)); - } - - @Override - public boolean isFileSelectable(@Nullable VirtualFile file) { - return file != null && !file.isDirectory() && file.getExtension() != null && extensions.contains(file.getExtension()); - } - }; + public static @Nullable VirtualFile selectImportSource( + @NotNull String @NotNull [] sourceExtensions, + @NotNull Component parent, + @Nullable VirtualFile preselect, + @Nullable @NlsContexts.Label String description + ) { + var descriptor = new FileChooserDescriptor(true, false, canSelectJarFile(sourceExtensions), false, false, false); + if (sourceExtensions.length == 1) { + descriptor.withExtensionFilter(sourceExtensions[0]); + } + else { + descriptor.withExtensionFilter(IdeCoreBundle.message("file.chooser.files.label", sourceExtensions[0].toUpperCase(Locale.ROOT)), sourceExtensions); + } if (description != null) { descriptor.setDescription(description); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/projectActions/ChangeProjectIconAction.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/projectActions/ChangeProjectIconAction.kt index 02d8654bb4d0..194ee064c50c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/projectActions/ChangeProjectIconAction.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/projectActions/ChangeProjectIconAction.kt @@ -1,11 +1,11 @@ -// 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.openapi.wm.impl.welcomeScreen.projectActions import com.intellij.icons.AllIcons import com.intellij.ide.* import com.intellij.ide.RecentProjectIconHelper.Companion.createIcon import com.intellij.openapi.actionSystem.* -import com.intellij.openapi.fileChooser.FileChooserDescriptor +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory import com.intellij.openapi.fileChooser.FileChooserFactory import com.intellij.openapi.project.DumbAwareAction import com.intellij.openapi.util.io.FileUtil @@ -109,9 +109,8 @@ internal class ChangeProjectIconAction : RecentProjectsWelcomeScreenActionBase() private class ChangeProjectIcon(private val ui: ProjectIconUI) : AnAction() { override fun actionPerformed(e: AnActionEvent) { val files = FileChooserFactory.getInstance() - .createFileChooser(FileChooserDescriptor(true, false, false, false, false, false).withFileFilter { file: VirtualFile -> - "svg".equals(file.extension, ignoreCase = true) - }, null, null).choose(null) + .createFileChooser(FileChooserDescriptorFactory.createSingleFileDescriptor("svg"), null, null) + .choose(null) if (files.size == 1) { try { val newIcon = createIcon(Path.of(files[0].path)) diff --git a/platform/platform-impl/src/com/intellij/util/net/ssl/CertificateConfigurable.java b/platform/platform-impl/src/com/intellij/util/net/ssl/CertificateConfigurable.java index 59a337d89162..2b502ed19dbf 100644 --- a/platform/platform-impl/src/com/intellij/util/net/ssl/CertificateConfigurable.java +++ b/platform/platform-impl/src/com/intellij/util/net/ssl/CertificateConfigurable.java @@ -1,9 +1,10 @@ -// 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.util.net.ssl; import com.intellij.ide.IdeBundle; import com.intellij.openapi.fileChooser.FileChooser; -import com.intellij.openapi.fileChooser.FileTypeDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; @@ -31,18 +32,13 @@ import java.util.Set; import static com.intellij.util.net.ssl.CertificateUtil.getCommonName; import static com.intellij.util.net.ssl.ConfirmingTrustManager.MutableTrustManager; -/** - * @author Mikhail Golubev - */ @ApiStatus.Internal public final class CertificateConfigurable implements SearchableConfigurable, Configurable.NoScroll, CertificateListener { - private static final FileTypeDescriptor CERTIFICATE_DESCRIPTOR = - new FileTypeDescriptor(IdeBundle.message("settings.certificate.choose.certificate"), - ".crt", ".CRT", - ".cer", ".CER", - ".pem", ".PEM", - ".der", ".DER"); - public static final @NonNls String EMPTY_PANEL = "empty.panel"; + public static final FileChooserDescriptor CERTIFICATE_DESCRIPTOR = FileChooserDescriptorFactory.createSingleFileDescriptor() + .withTitle(IdeBundle.message("settings.certificate.choose.certificate")) + .withExtensionFilter(IdeBundle.message("settings.certificate.filter.label"), "crt", "cer", "pem", "der"); + + public static final String EMPTY_PANEL = "empty.panel"; private JPanel myRootPanel; diff --git a/platform/service-container/resources/messages/BootstrapBundle.properties b/platform/service-container/resources/messages/BootstrapBundle.properties index 660795325f54..b61c283cc30e 100644 --- a/platform/service-container/resources/messages/BootstrapBundle.properties +++ b/platform/service-container/resources/messages/BootstrapBundle.properties @@ -66,6 +66,7 @@ bootstrap.error.message.marketplace=As a workaround, you may uninstall or update restart.failed.title=Restart Failed import.settings.title=Import {0} Settings +import.settings.filter=Settings files import.settings.restart=Imported settings contain custom VM options.\nPlease restart the IDE to apply these options. import.settings.restart.now=Restart Now import.settings.restart.later=Restart Later diff --git a/platform/tips-of-the-day/src/com/intellij/ide/util/DumpInvalidTipsActions.kt b/platform/tips-of-the-day/src/com/intellij/ide/util/DumpInvalidTipsActions.kt index cb1250f98d2c..d262a1a8d266 100644 --- a/platform/tips-of-the-day/src/com/intellij/ide/util/DumpInvalidTipsActions.kt +++ b/platform/tips-of-the-day/src/com/intellij/ide/util/DumpInvalidTipsActions.kt @@ -1,5 +1,4 @@ -// Copyright 2000-2022 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.ide.util import com.intellij.featureStatistics.ProductivityFeaturesRegistry @@ -10,6 +9,7 @@ import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.fileChooser.FileChooser import com.intellij.openapi.fileChooser.FileChooserDescriptor +import com.intellij.openapi.fileTypes.FileTypeManager import com.intellij.openapi.ide.CopyPasteManager import com.intellij.openapi.progress.runBackgroundableTask import com.intellij.openapi.vfs.VirtualFile @@ -76,7 +76,7 @@ internal class SelectAndDumpInvalidTipsAction : DumpInvalidTipsAction() { override fun actionPerformed(e: AnActionEvent) { val project = e.getData(CommonDataKeys.PROJECT) val descriptor = FileChooserDescriptor(true, true, false, false, false, true) - .withFileFilter { it.isDirectory || it.extension == "html" || it.extension == "htm" } + .withExtensionFilter(FileTypeManager.getInstance().getStdFileType("HTML")) .withDescription("Choose HTML files or folders with tips.") val chosenFiles = FileChooser.chooseFiles(descriptor, project, null) @@ -97,4 +97,3 @@ internal class SelectAndDumpInvalidTipsAction : DumpInvalidTipsAction() { } } } - diff --git a/platform/tips-of-the-day/src/com/intellij/ide/util/TipDialog.java b/platform/tips-of-the-day/src/com/intellij/ide/util/TipDialog.java index b2fb5bbfe2bb..6ec701c26e2e 100644 --- a/platform/tips-of-the-day/src/com/intellij/ide/util/TipDialog.java +++ b/platform/tips-of-the-day/src/com/intellij/ide/util/TipDialog.java @@ -1,14 +1,15 @@ -// Copyright 2000-2021 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.util; import com.intellij.CommonBundle; import com.intellij.ide.IdeBundle; import com.intellij.ide.TipsOfTheDayUsagesCollector; import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileChooser.FileChooserFactory; +import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -136,8 +137,8 @@ final class TipDialog extends DialogWrapper { @Override public void actionPerformed(ActionEvent e) { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(); - FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, true) - .withFileFilter(file -> Comparing.equal(file.getExtension(), "html", file.isCaseSensitive())); + FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createMultipleFilesNoJarsDescriptor() + .withExtensionFilter(FileTypeManager.getInstance().getStdFileType("HTML")); String value = propertiesComponent.getValue(LAST_OPENED_TIP_PATH); VirtualFile lastOpenedTip = value != null ? LocalFileSystem.getInstance().findFileByPath(value) : null; VirtualFile[] pathToSelect = lastOpenedTip != null ? new VirtualFile[]{lastOpenedTip} : VirtualFile.EMPTY_ARRAY; diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/InjectionsSettingsUI.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/InjectionsSettingsUI.java index 450c921f84eb..28d2195c9ff2 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/InjectionsSettingsUI.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/InjectionsSettingsUI.java @@ -4,7 +4,6 @@ package org.intellij.plugins.intelliLang; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.ide.IdeBundle; -import com.intellij.ide.highlighter.ArchiveFileType; import com.intellij.ide.ui.SplitterProportionsDataImpl; import com.intellij.lang.Language; import com.intellij.openapi.actionSystem.*; @@ -13,9 +12,8 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserFactory; import com.intellij.openapi.fileChooser.FileSaverDescriptor; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.fileTypes.FileTypeRegistry; +import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.fileTypes.FileTypes; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.DumbAwareAction; @@ -706,20 +704,10 @@ public final class InjectionsSettingsUI extends SearchableConfigurable.Parent.Ab } private void doImportAction(final DataContext dataContext) { - final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, true, false) { - @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(IntelliLangBundle.message("dialog.file.chooser.description.please.select.the.configuration.file")); - descriptor.setTitle(IntelliLangBundle.message("dialog.file.chooser.title.import.configuration")); + var descriptor = new FileChooserDescriptor(true, false, false, false, true, false) + .withExtensionFilter(FileTypeManager.getInstance().getStdFileType("XML")) + .withTitle(IntelliLangBundle.message("dialog.file.chooser.title.import.configuration")) + .withDescription(IntelliLangBundle.message("dialog.file.chooser.description.please.select.the.configuration.file")); descriptor.putUserData(LangDataKeys.MODULE_CONTEXT, PlatformCoreDataKeys.MODULE.getData(dataContext)); @@ -905,4 +893,4 @@ public final class InjectionsSettingsUI extends SearchableConfigurable.Parent.Ab return ActionUpdateThread.EDT; } } -} \ No newline at end of file +}