@@ -50,7 +50,9 @@ import software.aws.toolkits.jetbrains.utils.isRunningOnRemoteBackend
50
50
import software.aws.toolkits.resources.message
51
51
import java.awt.datatransfer.DataFlavor
52
52
import java.awt.dnd.DropTarget
53
+ import java.awt.dnd.DropTargetDragEvent
53
54
import java.awt.dnd.DropTargetDropEvent
55
+ import java.awt.dnd.DropTargetEvent
54
56
import java.io.File
55
57
import java.util.concurrent.CompletableFuture
56
58
import javax.imageio.ImageIO.read
@@ -146,6 +148,15 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
146
148
// As an alternative, enabling the native drag in JCEF,
147
149
// and let the native handling the drop event, and update the UI through JS bridge.
148
150
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
+ }
149
160
override fun drop (dtde : DropTargetDropEvent ) {
150
161
try {
151
162
dtde.acceptDrop(dtde.dropAction)
@@ -174,20 +185,16 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
174
185
validImages.subList(20 , validImages.size).clear()
175
186
}
176
187
188
+ executeJavaScript(browserInstance, " window.resetTopBarClicked()" )
189
+
190
+ setDragAndDropOverlayVisible(browserInstance, false )
191
+
177
192
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 ')" )
183
194
184
195
if (errorMessages.isNotEmpty()) {
185
196
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 ')" )
191
198
}
192
199
193
200
dtde.dropComplete(true )
@@ -294,6 +301,22 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
294
301
}
295
302
}
296
303
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
+
297
320
private fun validateImageFile (file : File , allowedTypes : Set <String >, maxFileSize : Double , maxDimension : Int ): String? {
298
321
val fileName = file.name
299
322
val ext = fileName.substringAfterLast(' .' , " " ).lowercase()
0 commit comments