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 ){
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 Object platformImage = image.getWidth() > 0 && image.getHeight() > 0 ?
350 image.getPlatformImage() : null;
351 if (platformImage != null) {
352 try {
353 File temp = File.createTempFile("jfx", ".png");
354 temp.deleteOnExit();
355 ImageIO.write(
356 toBufferedImage(Toolkit.getImageAccessor().fromPlatformImage(
357 Toolkit.getToolkit().loadPlatformImage(
358 platformImage
359 )
360 )),
361 "png",
362 temp);
363 content.put(DataFormat.FILES, Arrays.asList(temp));
364 } catch (IOException | SecurityException e) {
365 //That is ok. It was just an attempt.
366 //e.printStackTrace();
367 }
368 }
369 }
370 }
371
372 @Override public void confirmStartDrag() {
373 WebView view = accessor.getView();
374 if (view != null && content != null) {
375 //TODO: implement native support for Drag Source actions.
376 Dragboard db = view.startDragAndDrop(TransferMode.ANY);
377 db.setContent(content);
378 }
379 content = null;
380 }
381
382 @Override public boolean isDragConfirmed() {
383 return accessor.getView() != null && content != null;
384 }
385
386 // Method to implement the following via reflection:
|
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 }
383
384 @Override public boolean isDragConfirmed() {
385 return accessor.getView() != null && content != null;
386 }
387
388 // Method to implement the following via reflection:
|