@@ -50,7 +50,9 @@ import software.aws.toolkits.jetbrains.utils.isRunningOnRemoteBackend
5050import software.aws.toolkits.resources.message
5151import java.awt.datatransfer.DataFlavor
5252import java.awt.dnd.DropTarget
53+ import java.awt.dnd.DropTargetDragEvent
5354import java.awt.dnd.DropTargetDropEvent
55+ import java.awt.dnd.DropTargetEvent
5456import java.io.File
5557import java.util.concurrent.CompletableFuture
5658import javax.imageio.ImageIO.read
@@ -146,6 +148,15 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
146148 // As an alternative, enabling the native drag in JCEF,
147149 // and let the native handling the drop event, and update the UI through JS bridge.
148150 val dropTarget = object : DropTarget () {
151+ override fun dragEnter (dtde : DropTargetDragEvent ) {
152+ setDragAndDropOverlayVisible(browserInstance, true )
153+ }
154+ override fun dragOver (dtde : DropTargetDragEvent ) {
155+ setDragAndDropOverlayVisible(browserInstance, true )
156+ }
157+ override fun dragExit (dte : DropTargetEvent ) {
158+ setDragAndDropOverlayVisible(browserInstance, false )
159+ }
149160 override fun drop (dtde : DropTargetDropEvent ) {
150161 try {
151162 dtde.acceptDrop(dtde.dropAction)
@@ -174,20 +185,16 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
174185 validImages.subList(20 , validImages.size).clear()
175186 }
176187
188+ executeJavaScript(browserInstance, " window.resetTopBarClicked()" )
189+
190+ setDragAndDropOverlayVisible(browserInstance, false )
191+
177192 val json = OBJECT_MAPPER .writeValueAsString(validImages)
178- browserInstance.jcefBrowser.cefBrowser.executeJavaScript(
179- " window.handleNativeDrop('$json ')" ,
180- browserInstance.jcefBrowser.cefBrowser.url,
181- 0
182- )
193+ executeJavaScript(browserInstance, " window.handleNativeDrop('$json ')" )
183194
184195 if (errorMessages.isNotEmpty()) {
185196 val errorJson = OBJECT_MAPPER .writeValueAsString(errorMessages)
186- browserInstance.jcefBrowser.cefBrowser.executeJavaScript(
187- " window.handleNativeNotify('$errorJson ')" ,
188- browserInstance.jcefBrowser.cefBrowser.url,
189- 0
190- )
197+ executeJavaScript(browserInstance, " window.handleNativeNotify('$errorJson ')" )
191198 }
192199
193200 dtde.dropComplete(true )
@@ -294,6 +301,22 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
294301 }
295302 }
296303
304+ private fun executeJavaScript (browserInstance : Browser , jsCommand : String ) {
305+ try {
306+ browserInstance.jcefBrowser.cefBrowser.executeJavaScript(
307+ jsCommand,
308+ browserInstance.jcefBrowser.cefBrowser.url,
309+ 0
310+ )
311+ } catch (e: Exception ) {
312+ LOG .error { " Failed to execute JavaScript: $jsCommand - ${e.message} " }
313+ }
314+ }
315+
316+ private fun setDragAndDropOverlayVisible (browserInstance : Browser , visible : Boolean ) {
317+ executeJavaScript(browserInstance, " window.setDragAndDropVisible('$visible ')" )
318+ }
319+
297320 private fun validateImageFile (file : File , allowedTypes : Set <String >, maxFileSize : Double , maxDimension : Int ): String? {
298321 val fileName = file.name
299322 val ext = fileName.substringAfterLast(' .' , " " ).lowercase()
0 commit comments