< prev index next >

modules/javafx.web/src/main/java/com/sun/javafx/webkit/UIClientImpl.java

Print this page




 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:
< prev index next >