/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.ui.editor.image;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import javax.media.jai.PlanarImage;
import javax.media.jai.TiledImage;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
import org.weasis.core.api.gui.model.ViewModel;
import org.weasis.core.api.image.util.ImageFiler;
import org.weasis.core.api.media.data.ImageElement;
import org.weasis.core.ui.model.layer.LayerAnnotation;
import org.weasis.core.ui.model.utils.imp.DefaultViewModel;
import org.weasis.core.ui.util.ImagePrint;
public class ViewTransferHandler extends TransferHandler implements Transferable {
private static final DataFlavor flavors[] = { DataFlavor.imageFlavor };
private Image image;
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
@Override
public boolean canImport(JComponent comp, DataFlavor flavor[]) {
return false;
}
@Override
public Transferable createTransferable(JComponent comp) {
// Clear
image = null;
if (comp instanceof DefaultView2d) {
DefaultView2d view2DPane = (DefaultView2d) comp;
PlanarImage imgP = createComponentImage(view2DPane);
if (imgP != null) {
image = imgP.getAsBufferedImage();
return this;
}
}
return null;
}
@Override
public boolean importData(JComponent comp, Transferable t) {
return false;
}
// Transferable
@Override
public Object getTransferData(DataFlavor flavor) {
if (isDataFlavorSupported(flavor)) {
return image;
}
return null;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return flavors;
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(DataFlavor.imageFlavor);
}
private static PlanarImage createComponentImage(DefaultView2d canvas) {
TiledImage img = ImageFiler.getEmptyTiledImage(Color.BLACK, canvas.getWidth(), canvas.getHeight());
ExportImage<ImageElement> exportImage = new ExportImage<ImageElement>(canvas);
try {
exportImage.getInfoLayer().setDisplayPreferencesValue(LayerAnnotation.ANONYM_ANNOTATIONS, true);
exportImage.getInfoLayer().setBorder(3);
Graphics2D g = img.createGraphics();
if (g != null) {
ViewModel originViewModel = canvas.getViewModel();
ViewModel viewModel = exportImage.getViewModel();
final Rectangle modelArea = exportImage.getImageBounds(exportImage.getImage());
((DefaultViewModel) viewModel).adjustMinViewScaleFromImage(modelArea.width, modelArea.height);
viewModel.setModelArea(originViewModel.getModelArea());
viewModel.setModelOffset(originViewModel.getModelOffsetX(), originViewModel.getModelOffsetY(),
originViewModel.getViewScale());
exportImage.setBounds(canvas.getX(), canvas.getY(), canvas.getWidth(), canvas.getHeight());
boolean wasBuffered = ImagePrint.disableDoubleBuffering(exportImage);
exportImage.zoom(originViewModel.getViewScale());
exportImage.draw(g);
ImagePrint.restoreDoubleBuffering(exportImage, wasBuffered);
g.dispose();
}
} finally {
exportImage.disposeView();
}
return img;
}
}