Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type" : "bugfix",
"description" : "Fix unsupported files being shown in file picker when selecting images for adding image context in Windows"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.amazonq.lsp.util

import com.intellij.openapi.fileChooser.FileChooserDescriptor

/**
* FileChooserCompat implementation for IntelliJ Platform versions before 2024.3 (baseline < 243).
* Uses withFileFilter method which provides filtering functionality but doesn't visually filter
* files in the chooser dialog.
*/
internal class FileChooserCompatImpl : FileChooserCompat {
override fun applyExtensionFilter(
descriptor: FileChooserDescriptor,
filterName: String,
allowedExtensions: Set<String>,
): FileChooserDescriptor = descriptor.withFileFilter { virtualFile ->
if (virtualFile.isDirectory) {
true // Always allow directories for navigation
} else {
val extension = virtualFile.extension?.lowercase()
extension != null && allowedExtensions.contains(extension)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.amazonq.lsp.util

import com.intellij.openapi.fileChooser.FileChooserDescriptor

/**
* FileChooserCompat implementation for IntelliJ Platform versions 2024.3+ (baseline >= 243).
* Uses withExtensionFilter method which provides both filtering functionality and visual
* filtering in the chooser dialog.
*/
internal class FileChooserCompatImpl : FileChooserCompat {
override fun applyExtensionFilter(
descriptor: FileChooserDescriptor,
filterName: String,
allowedExtensions: Set<String>,
): FileChooserDescriptor = descriptor.withExtensionFilter(filterName, *allowedExtensions.toTypedArray())
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowO
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileChooserCompat
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.TelemetryParsingUtil
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
Expand Down Expand Up @@ -311,15 +312,8 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
if (params.filters.isNotEmpty() && !params.canSelectFolders) {
// Create a combined list of all allowed extensions
val allowedExtensions = params.filters.values.flatten().toSet()

withFileFilter { virtualFile ->
if (virtualFile.isDirectory) {
true // Always allow directories for navigation
} else {
val extension = virtualFile.extension?.lowercase()
extension != null && allowedExtensions.contains(extension)
}
}
val fileChooserCompat = FileChooserCompat.getInstance()
fileChooserCompat.applyExtensionFilter(this, "Images", allowedExtensions)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.amazonq.lsp.util

import com.intellij.openapi.fileChooser.FileChooserDescriptor

/**
* Compatibility interface for handling file chooser extension filtering across different IntelliJ Platform versions.
*
* The withExtensionFilter method was introduced in IntelliJ Platform 2024.3 (baseline version 243).
* For older versions, fall back to withFileFilter which provides similar functionality
*/
interface FileChooserCompat {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this interface, can we just add a separate function in the separate modules?

/**
* Applies file extension filtering to the given FileChooserDescriptor.
*
* @param descriptor The FileChooserDescriptor to apply filtering to
* @param filterName The display name for the filter (e.g., "Images")
* @param allowedExtensions Set of allowed file extensions (e.g., "jpg", "png")
* @return The modified FileChooserDescriptor
*/
fun applyExtensionFilter(
descriptor: FileChooserDescriptor,
filterName: String,
allowedExtensions: Set<String>,
): FileChooserDescriptor

companion object {
fun getInstance(): FileChooserCompat = FileChooserCompatImpl()
}
}
Loading