@@ -49,7 +49,9 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isCodeTrans
49
49
import software.aws.toolkits.resources.message
50
50
import java.awt.datatransfer.DataFlavor
51
51
import java.awt.dnd.DropTarget
52
+ import java.awt.dnd.DropTargetDragEvent
52
53
import java.awt.dnd.DropTargetDropEvent
54
+ import java.awt.dnd.DropTargetEvent
53
55
import java.io.File
54
56
import java.util.concurrent.CompletableFuture
55
57
import javax.imageio.ImageIO.read
@@ -138,6 +140,15 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
138
140
// As an alternative, enabling the native drag in JCEF,
139
141
// and let the native handling the drop event, and update the UI through JS bridge.
140
142
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
+ }
141
152
override fun drop (dtde : DropTargetDropEvent ) {
142
153
try {
143
154
dtde.acceptDrop(dtde.dropAction)
@@ -166,20 +177,16 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
166
177
validImages.subList(20 , validImages.size).clear()
167
178
}
168
179
180
+ executeJavaScript(browserInstance, " window.resetTopBarClicked()" )
181
+
182
+ setDragAndDropOverlayVisible(browserInstance, false )
183
+
169
184
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 ')" )
175
186
176
187
if (errorMessages.isNotEmpty()) {
177
188
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 ')" )
183
190
}
184
191
185
192
dtde.dropComplete(true )
@@ -286,6 +293,22 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
286
293
}
287
294
}
288
295
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
+
289
312
private fun validateImageFile (file : File , allowedTypes : Set <String >, maxFileSize : Double , maxDimension : Int ): String? {
290
313
val fileName = file.name
291
314
val ext = fileName.substringAfterLast(' .' , " " ).lowercase()
0 commit comments