< 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, 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     }


< prev index next >