org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramImageGenerator.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramImageGenerator.java

Source

/******************************************************************************
 * Copyright (c) 2002, 2009 IBM Corporation 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:
 *    IBM Corporation - initial API and implementation 
 ****************************************************************************/

package org.eclipse.gmf.runtime.diagram.ui.render.clipboard;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.List;

import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.SWTGraphics;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PrecisionPoint;
import org.eclipse.draw2d.geometry.PrecisionRectangle;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gmf.runtime.common.ui.util.DisplayUtils;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
import org.eclipse.gmf.runtime.draw2d.ui.internal.graphics.ScaledGraphics;
import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.graphics.GraphicsToGraphics2DAdaptor;
import org.eclipse.gmf.runtime.draw2d.ui.render.internal.graphics.RenderedMapModeGraphics;
import org.eclipse.gmf.runtime.draw2d.ui.render.internal.graphics.RenderedScaledGraphics;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Display;

/**
 * Supports generation of AWT and SWT images of a diagram or a subset of
 * editparts on a diagram.
 * 
 * @author schafe / sshaw
 */
public class DiagramImageGenerator extends DiagramGenerator {

    /**
     * Creates a new instance.
     * @param dgrmEP
     *            the diagram editpart
     */
    public DiagramImageGenerator(DiagramEditPart dgrmEP) {
        super(dgrmEP);
    }

    private GC gc = null;

    private Image image = null;

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.gmf.runtime.diagram.ui.internal.clipboard.DiagramGenerator#setUpGraphics(int,
     *      int)
     */
    protected Graphics setUpGraphics(int width, int height) {
        Display display = DisplayUtils.getDisplay();

        image = new Image(display, new org.eclipse.swt.graphics.Rectangle(0, 0, width, height));
        gc = new GC(image);
        SWTGraphics swtG = new SWTGraphics(gc);
        swtG.setAdvanced(true);
        swtG.setAntialias(SWT.ON);

        /*
        IPreferenceStore preferenceStore =
           (IPreferenceStore) getDiagramEditPart().getDiagramPreferencesHint().getPreferenceStore();
            
        if (preferenceStore.getBoolean(IPreferenceConstants.PREF_ENABLE_ANTIALIAS)) {
           swtG.setAntialias(SWT.ON);
        } else {
           swtG.setAntialias(SWT.OFF);
        }
        */
        return swtG;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.gmf.runtime.diagram.ui.internal.clipboard.DiagramGenerator#disposeGraphics(org.eclipse.draw2d.Graphics)
     */
    protected void disposeGraphics(Graphics g) {
        super.disposeGraphics(g);

        image.dispose();

        if (gc != null)
            gc.dispose();
        gc = null;

    }

    /* (non-Javadoc)
     * @see org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramGenerator#getImageDescriptor(org.eclipse.draw2d.Graphics)
     */
    protected ImageDescriptor getImageDescriptor(Graphics g) {
        return new ImageDescriptor() {

            ImageData imgData = image.getImageData();

            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.jface.resource.ImageDescriptor#getImageData()
             */
            public ImageData getImageData() {
                return imgData;
            }
        };
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramGenerator#createAWTImageForParts(java.util.List,
     *      org.eclipse.swt.graphics.Rectangle)
     */
    public java.awt.Image createAWTImageForParts(List selectedObjects,
            org.eclipse.swt.graphics.Rectangle sourceRect) {

        BufferedImage awtImage = null;
        IMapMode mm = getMapMode();
        PrecisionRectangle rect = new PrecisionRectangle();
        rect.setX(sourceRect.x);
        rect.setY(sourceRect.y);
        rect.setWidth(sourceRect.width);
        rect.setHeight(sourceRect.height);

        mm.LPtoDP(rect);

        awtImage = new BufferedImage((int) Math.round(rect.preciseWidth), (int) Math.rint(rect.preciseHeight),
                BufferedImage.TYPE_4BYTE_ABGR_PRE);

        Graphics2D g2d = awtImage.createGraphics();
        g2d.setColor(Color.white);
        g2d.fillRect(0, 0, awtImage.getWidth(), awtImage.getHeight());

        // Check anti-aliasing preference
        IPreferenceStore preferenceStore = (IPreferenceStore) getDiagramEditPart().getDiagramPreferencesHint()
                .getPreferenceStore();

        if (preferenceStore.getBoolean(IPreferenceConstants.PREF_ENABLE_ANTIALIAS)) {
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        } else {
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
        }

        g2d.clip(new java.awt.Rectangle(0, 0, awtImage.getWidth(), awtImage.getHeight()));

        Graphics graphics = new GraphicsToGraphics2DAdaptor(g2d,
                new Rectangle(0, 0, awtImage.getWidth(), awtImage.getHeight()));

        RenderedMapModeGraphics mapModeGraphics = new RenderedMapModeGraphics(graphics, mm);

        renderToGraphics(mapModeGraphics, new Point(sourceRect.x, sourceRect.y), selectedObjects);

        graphics.dispose();
        g2d.dispose();
        return awtImage;
    }

    /* (non-Javadoc)
     * @see org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramGenerator#createConstrainedAWTImageForParts(java.util.List, int, int, boolean)
     */
    public java.awt.Image createConstrainedAWTImageForParts(List editParts, int maxDeviceWidth, int maxDeviceHeight,
            boolean useMargins) {
        BufferedImage awtImage = null;
        IMapMode mm = getMapMode();

        ConstrainedImageRenderingData data = getConstrainedImageRenderingData(editParts, maxDeviceWidth,
                maxDeviceHeight, useMargins);

        awtImage = new BufferedImage(data.imageWidth, data.imageHeight, BufferedImage.TYPE_4BYTE_ABGR_PRE);

        Graphics2D g2d = awtImage.createGraphics();
        g2d.setColor(Color.white);
        g2d.fillRect(0, 0, awtImage.getWidth(), awtImage.getHeight());

        // Check anti-aliasing preference
        IPreferenceStore preferenceStore = (IPreferenceStore) getDiagramEditPart().getDiagramPreferencesHint()
                .getPreferenceStore();

        if (preferenceStore.getBoolean(IPreferenceConstants.PREF_ENABLE_ANTIALIAS)) {
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        } else {
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
        }

        g2d.clip(new java.awt.Rectangle(0, 0, awtImage.getWidth(), awtImage.getHeight()));

        Graphics graphics = new GraphicsToGraphics2DAdaptor(g2d,
                new org.eclipse.swt.graphics.Rectangle(0, 0, data.imageWidth, data.imageHeight));

        ScaledGraphics scaledGraphics = new RenderedScaledGraphics(graphics);

        RenderedMapModeGraphics mapModeGraphics = new RenderedMapModeGraphics(scaledGraphics, mm);

        g2d.translate(data.margin, data.margin);
        mapModeGraphics.scale(data.scalingFactor);

        Point location = new PrecisionPoint(data.imageOriginalBounds.preciseX(),
                data.imageOriginalBounds.preciseY());
        mm.DPtoLP(location);
        renderToGraphics(mapModeGraphics, location, editParts);

        graphics.dispose();
        g2d.dispose();
        return awtImage;
    }

}