295 } 296 297 private ClipboardContent content; 298 private static DataFormat getDataFormat(String mimeType) { 299 synchronized (DataFormat.class) { 300 DataFormat ret = DataFormat.lookupMimeType(mimeType); 301 if (ret == null) { 302 ret = new DataFormat(mimeType); 303 } 304 return ret; 305 } 306 } 307 308 //copy from com.sun.glass.ui.Clipboard 309 private final static DataFormat DF_DRAG_IMAGE = getDataFormat(DRAG_IMAGE); 310 private final static DataFormat DF_DRAG_IMAGE_OFFSET = getDataFormat(DRAG_IMAGE_OFFSET); 311 312 @Override public void startDrag(WCImage image, 313 int imageOffsetX, int imageOffsetY, 314 int eventPosX, int eventPosY, 315 String[] mimeTypes, Object[] values, boolean isImageSource 316 ){ 317 content = new ClipboardContent(); 318 for (int i = 0; i < mimeTypes.length; ++i) if (values[i] != null) { 319 try { 320 content.put(getDataFormat(mimeTypes[i]), 321 IE_URL_SHORTCUT_FILENAME.equals(mimeTypes[i]) 322 ? (Object)ByteBuffer.wrap(((String)values[i]).getBytes("UTF-16LE")) 323 : (Object)values[i]); 324 } catch (UnsupportedEncodingException ex) { 325 //never happens 326 } 327 } 328 if (image != null) { 329 ByteBuffer dragImageOffset = ByteBuffer.allocate(8); 330 dragImageOffset.rewind(); 331 dragImageOffset.putInt(imageOffsetX); 332 dragImageOffset.putInt(imageOffsetY); 333 content.put(DF_DRAG_IMAGE_OFFSET, dragImageOffset); 334 335 int w = image.getWidth(); 336 int h = image.getHeight(); 337 ByteBuffer pixels = image.getPixelBuffer(); 338 339 ByteBuffer dragImage = ByteBuffer.allocate(8 + w*h*4); 340 dragImage.putInt(w); 341 dragImage.putInt(h); 342 dragImage.put(pixels); 343 content.put(DF_DRAG_IMAGE, dragImage); 344 345 //The image is prepared synchronously, that is sad. 346 //Image need to be created by target request only. 347 //QuantumClipboard.putContent have to be rewritten in Glass manner 348 //with postponed data requests (DelayedCallback data object). 349 if (isImageSource) { 350 Object platformImage = image.getWidth() > 0 && image.getHeight() > 0 ? 351 image.getPlatformImage() : null; 352 if (platformImage != null) { 353 try { 354 File temp = File.createTempFile("jfx", ".png"); 355 temp.deleteOnExit(); 356 ImageIO.write( 357 toBufferedImage(Toolkit.getImageAccessor().fromPlatformImage( 358 Toolkit.getToolkit().loadPlatformImage( 359 platformImage 360 ) 361 )), 362 "png", 363 temp); 364 content.put(DataFormat.FILES, Arrays.asList(temp)); 365 } catch (IOException | SecurityException e) { 366 //That is ok. It was just an attempt. 367 //e.printStackTrace(); 368 } 369 } 370 } 371 } 372 } 373 374 @Override public void confirmStartDrag() { 375 WebView view = accessor.getView(); 376 if (view != null && content != null) { 377 //TODO: implement native support for Drag Source actions. 378 Dragboard db = view.startDragAndDrop(TransferMode.ANY); 379 db.setContent(content); 380 } 381 content = null; 382 } | 295 } 296 297 private ClipboardContent content; 298 private static DataFormat getDataFormat(String mimeType) { 299 synchronized (DataFormat.class) { 300 DataFormat ret = DataFormat.lookupMimeType(mimeType); 301 if (ret == null) { 302 ret = new DataFormat(mimeType); 303 } 304 return ret; 305 } 306 } 307 308 //copy from com.sun.glass.ui.Clipboard 309 private final static DataFormat DF_DRAG_IMAGE = getDataFormat(DRAG_IMAGE); 310 private final static DataFormat DF_DRAG_IMAGE_OFFSET = getDataFormat(DRAG_IMAGE_OFFSET); 311 312 @Override public void startDrag(WCImage image, 313 int imageOffsetX, int imageOffsetY, 314 int eventPosX, int eventPosY, 315 String[] mimeTypes, Object[] values, 316 boolean isImageSource, String imageFileExt 317 ){ 318 content = new ClipboardContent(); 319 for (int i = 0; i < mimeTypes.length; ++i) if (values[i] != null) { 320 try { 321 content.put(getDataFormat(mimeTypes[i]), 322 IE_URL_SHORTCUT_FILENAME.equals(mimeTypes[i]) 323 ? (Object)ByteBuffer.wrap(((String)values[i]).getBytes("UTF-16LE")) 324 : (Object)values[i]); 325 } catch (UnsupportedEncodingException ex) { 326 //never happens 327 } 328 } 329 if (image != null) { 330 ByteBuffer dragImageOffset = ByteBuffer.allocate(8); 331 dragImageOffset.rewind(); 332 dragImageOffset.putInt(imageOffsetX); 333 dragImageOffset.putInt(imageOffsetY); 334 content.put(DF_DRAG_IMAGE_OFFSET, dragImageOffset); 335 336 int w = image.getWidth(); 337 int h = image.getHeight(); 338 ByteBuffer pixels = image.getPixelBuffer(); 339 340 ByteBuffer dragImage = ByteBuffer.allocate(8 + w*h*4); 341 dragImage.putInt(w); 342 dragImage.putInt(h); 343 dragImage.put(pixels); 344 content.put(DF_DRAG_IMAGE, dragImage); 345 346 //The image is prepared synchronously, that is sad. 347 //Image need to be created by target request only. 348 //QuantumClipboard.putContent have to be rewritten in Glass manner 349 //with postponed data requests (DelayedCallback data object). 350 if (isImageSource) { 351 Object platformImage = image.getWidth() > 0 && image.getHeight() > 0 ? 352 image.getPlatformImage() : null; 353 if (platformImage != null) { 354 try { 355 File temp = File.createTempFile("jfx", "." + imageFileExt); 356 temp.deleteOnExit(); 357 ImageIO.write( 358 toBufferedImage(Toolkit.getImageAccessor().fromPlatformImage( 359 Toolkit.getToolkit().loadPlatformImage( 360 platformImage 361 ) 362 )), 363 imageFileExt, 364 temp); 365 content.put(DataFormat.FILES, Arrays.asList(temp)); 366 } catch (IOException | SecurityException e) { 367 //That is ok. It was just an attempt. 368 //e.printStackTrace(); 369 } 370 } 371 } 372 } 373 } 374 375 @Override public void confirmStartDrag() { 376 WebView view = accessor.getView(); 377 if (view != null && content != null) { 378 //TODO: implement native support for Drag Source actions. 379 Dragboard db = view.startDragAndDrop(TransferMode.ANY); 380 db.setContent(content); 381 } 382 content = null; 383 } |