@@ -49,7 +49,9 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isCodeTrans
4949import software.aws.toolkits.resources.message
5050import java.awt.datatransfer.DataFlavor
5151import java.awt.dnd.DropTarget
52+ import java.awt.dnd.DropTargetDragEvent
5253import java.awt.dnd.DropTargetDropEvent
54+ import java.awt.dnd.DropTargetEvent
5355import java.io.File
5456import java.util.concurrent.CompletableFuture
5557import javax.imageio.ImageIO.read
@@ -138,6 +140,15 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
138140 // As an alternative, enabling the native drag in JCEF,
139141 // and let the native handling the drop event, and update the UI through JS bridge.
140142 val dropTarget = object : DropTarget () {
143+ override fun dragEnter (dtde : DropTargetDragEvent ) {
144+ setDragAndDropOverlayVisible(browserInstance, true )
145+ }
146+ override fun dragOver (dtde : DropTargetDragEvent ) {
147+ setDragAndDropOverlayVisible(browserInstance, true )
148+ }
149+ override fun dragExit (dte : DropTargetEvent ) {
150+ setDragAndDropOverlayVisible(browserInstance, false )
151+ }
141152 override fun drop (dtde : DropTargetDropEvent ) {
142153 try {
143154 dtde.acceptDrop(dtde.dropAction)
@@ -166,20 +177,16 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
166177 validImages.subList(20 , validImages.size).clear()
167178 }
168179
180+ executeJavaScript(browserInstance, " window.resetTopBarClicked()" )
181+
182+ setDragAndDropOverlayVisible(browserInstance, false )
183+
169184 val json = OBJECT_MAPPER .writeValueAsString(validImages)
170- browserInstance.jcefBrowser.cefBrowser.executeJavaScript(
171- " window.handleNativeDrop('$json ')" ,
172- browserInstance.jcefBrowser.cefBrowser.url,
173- 0
174- )
185+ executeJavaScript(browserInstance, " window.handleNativeDrop('$json ')" )
175186
176187 if (errorMessages.isNotEmpty()) {
177188 val errorJson = OBJECT_MAPPER .writeValueAsString(errorMessages)
178- browserInstance.jcefBrowser.cefBrowser.executeJavaScript(
179- " window.handleNativeNotify('$errorJson ')" ,
180- browserInstance.jcefBrowser.cefBrowser.url,
181- 0
182- )
189+ executeJavaScript(browserInstance, " window.handleNativeNotify('$errorJson ')" )
183190 }
184191
185192 dtde.dropComplete(true )
@@ -286,6 +293,22 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
286293 }
287294 }
288295
296+ private fun executeJavaScript (browserInstance : Browser , jsCommand : String ) {
297+ try {
298+ browserInstance.jcefBrowser.cefBrowser.executeJavaScript(
299+ jsCommand,
300+ browserInstance.jcefBrowser.cefBrowser.url,
301+ 0
302+ )
303+ } catch (e: Exception ) {
304+ LOG .error { " Failed to execute JavaScript: $jsCommand - ${e.message} " }
305+ }
306+ }
307+
308+ private fun setDragAndDropOverlayVisible (browserInstance : Browser , visible : Boolean ) {
309+ executeJavaScript(browserInstance, " window.setDragAndDropVisible('$visible ')" )
310+ }
311+
289312 private fun validateImageFile (file : File , allowedTypes : Set <String >, maxFileSize : Double , maxDimension : Int ): String? {
290313 val fileName = file.name
291314 val ext = fileName.substringAfterLast(' .' , " " ).lowercase()
0 commit comments