blob: 5fcb470e16e8998319c587bf06b54fcd2ae576aa [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2002 - 2005 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.gmf.runtime.common.core.util.Trace;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.l10n.SharedImages;
import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
import org.eclipse.gmf.runtime.diagram.ui.render.internal.DiagramUIRenderDebugOptions;
import org.eclipse.gmf.runtime.diagram.ui.render.internal.DiagramUIRenderPlugin;
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.awt.internal.image.ImageConverter;
import org.eclipse.gmf.runtime.draw2d.ui.render.internal.graphics.RenderedMapModeGraphics;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Rectangle;
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 = Display.getDefault();
image = new Image(display, new Rectangle(0, 0, width, height));
gc = new GC(image);
SWTGraphics swtG = new SWTGraphics(gc);
/*
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.internal.clipboard.DiagramGenerator#createAWTImageForParts(java.util.List)
*/
public java.awt.Image createAWTImageForParts(List selectedObjects) {
org.eclipse.swt.graphics.Rectangle sourceRect = calculateImageRectangle(selectedObjects);
BufferedImage awtImage = null;
try {
IMapMode mm = getMapMode();
awtImage = new BufferedImage(mm.LPtoDP(sourceRect.width),
mm.LPtoDP(sourceRect.height),
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, mm.LPtoDP(sourceRect.width), mm
.LPtoDP(sourceRect.height)));
RenderedMapModeGraphics mapModeGraphics = new RenderedMapModeGraphics(
graphics, mm);
renderToGraphics(mapModeGraphics, new Point(sourceRect.x, sourceRect.y), selectedObjects);
graphics.dispose();
g2d.dispose();
} catch (Error e) {
// log the Error but allow execution to continue
Trace.catching(DiagramUIRenderPlugin.getInstance(),
DiagramUIRenderDebugOptions.EXCEPTIONS_THROWING, getClass(),
"createAWTImageForParts() failed to generate image", //$NON-NLS-1$
e);
awtImage = ImageConverter.convert(SharedImages.get(SharedImages.IMG_ERROR));
} catch (Exception ex) {
// log the Exception but allow execution to continue
Trace.catching(DiagramUIRenderPlugin.getInstance(),
DiagramUIRenderDebugOptions.EXCEPTIONS_THROWING, getClass(),
"createAWTImageForParts() failed to generate image", //$NON-NLS-1$
ex);
awtImage = ImageConverter.convert(SharedImages.get(SharedImages.IMG_ERROR));
}
return awtImage;
}
}