Java Tutorial/SWT/SWT AWT Swing
Содержание
- 1 17. Create a FontData object which encapsulate the essential data to create a swt font.
- 2 17. Create an awt font by converting as much information as possible from the provided swt Font.
- 3 17. Create an awt font by converting as much information as possible from the provided swt FontData.
- 4 17. Creates an awt color instance to match the rgb values of the specified swt color.
- 5 17. Creates an AWT MouseEvent from a swt event.
- 6 17. Creates a swt color instance to match the rgb values of the specified awt color. alpha channel is not supported.
- 7 17. Creates a swt color instance to match the rgb values of the specified awt paint.
- 8 17. Draw Graphics2D stuff on a swt composite
- 9 17. Embed a JTable in SWT (no flicker)
- 10 17. Embeded Swing/AWT components to SWT
- 11 17. Returns an AWT point with the same coordinates as the specified SWT point.
- 12 17. Returns an SWT point with the same coordinates as the specified AWT point.
- 13 17. Returns an SWT point with the same coordinates as the specified AWT point (rounded to integer values).
- 14 17. Transform an awt Rectangle2d instance into a swt Rectangle2d.
- 15 17. Transform a swt Rectangle instance into an AWT Rectangle.
- 16 17. Using AWT to paint inside SWT
17. Create a FontData object which encapsulate the essential data to create a swt font.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr";
/** A dummy JPanel used to provide font metrics. */
protected static final JPanel DUMMY_PANEL = new JPanel();
/**
* Create a FontData
object which encapsulate
* the essential data to create a swt font. The data is taken
* from the provided awt Font.
* Generally speaking, given a font size, the returned swt font
* will display differently on the screen than the awt one.
* Because the SWT toolkit use native graphical resources whenever
* it is possible, this fact is platform dependent. To address
* this issue, it is possible to enforce the method to return
* a font with the same size (or at least as close as possible)
* as the awt one.
* <p>When the object is no more used, the user must explicitly
* call the dispose method on the returned font to free the
* operating system resources (the garbage collector won"t do it).
*
* @param device The swt device to draw on (display or gc device).
* @param font The awt font from which to get the data.
* @param ensureSameSize A boolean used to enforce the same size
* (in pixels) between the awt font and the newly created swt font.
* @return a FontData
object.
*/
public static FontData toSwtFontData(Device device, java.awt.Font font,
boolean ensureSameSize) {
FontData fontData = new FontData();
fontData.setName(font.getFamily());
// SWT and AWT share the same style constants.
fontData.setStyle(font.getStyle());
// convert the font size (in pt for awt) to height in pixels for swt
int height = (int) Math.round(font.getSize() * 72.0
/ device.getDPI().y);
fontData.setHeight(height);
// hack to ensure the newly created swt fonts will be rendered with the
// same height as the awt one
if (ensureSameSize) {
GC tmpGC = new GC(device);
Font tmpFont = new Font(device, fontData);
tmpGC.setFont(tmpFont);
if (tmpGC.textExtent(Az).x
> DUMMY_PANEL.getFontMetrics(font).stringWidth(Az)) {
while (tmpGC.textExtent(Az).x
> DUMMY_PANEL.getFontMetrics(font).stringWidth(Az)) {
tmpFont.dispose();
height--;
fontData.setHeight(height);
tmpFont = new Font(device, fontData);
tmpGC.setFont(tmpFont);
}
}
else if (tmpGC.textExtent(Az).x
< DUMMY_PANEL.getFontMetrics(font).stringWidth(Az)) {
while (tmpGC.textExtent(Az).x
< DUMMY_PANEL.getFontMetrics(font).stringWidth(Az)) {
tmpFont.dispose();
height++;
fontData.setHeight(height);
tmpFont = new Font(device, fontData);
tmpGC.setFont(tmpFont);
}
}
tmpFont.dispose();
tmpGC.dispose();
}
return fontData;
}
/**
* Create an awt font by converting as much information
* as possible from the provided swt FontData
.
* <p>Generally speaking, given a font size, an swt font will
* display differently on the screen than the corresponding awt
* one. Because the SWT toolkit use native graphical ressources whenever
* it is possible, this fact is platform dependent. To address
* this issue, it is possible to enforce the method to return
* an awt font with the same height as the swt one.
*
* @param device The swt device being drawn on (display or gc device).
* @param fontData The swt font to convert.
* @param ensureSameSize A boolean used to enforce the same size
* (in pixels) between the swt font and the newly created awt font.
* @return An awt font converted from the provided swt font.
*/
public static java.awt.Font toAwtFont(Device device, FontData fontData,
boolean ensureSameSize) {
int height = (int) Math.round(fontData.getHeight() * device.getDPI().y
/ 72.0);
// hack to ensure the newly created awt fonts will be rendered with the
// same height as the swt one
if (ensureSameSize) {
GC tmpGC = new GC(device);
Font tmpFont = new Font(device, fontData);
tmpGC.setFont(tmpFont);
JPanel DUMMY_PANEL = new JPanel();
java.awt.Font tmpAwtFont = new java.awt.Font(fontData.getName(),
fontData.getStyle(), height);
if (DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(Az)
> tmpGC.textExtent(Az).x) {
while (DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(Az)
> tmpGC.textExtent(Az).x) {
height--;
tmpAwtFont = new java.awt.Font(fontData.getName(),
fontData.getStyle(), height);
}
}
else if (DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(Az)
< tmpGC.textExtent(Az).x) {
while (DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(Az)
< tmpGC.textExtent(Az).x) {
height++;
tmpAwtFont = new java.awt.Font(fontData.getName(),
fontData.getStyle(), height);
}
}
tmpFont.dispose();
tmpGC.dispose();
}
return new java.awt.Font(fontData.getName(), fontData.getStyle(),
height);
}
}</source>
17. Create an awt font by converting as much information as possible from the provided swt Font.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/**
* Create an awt font by converting as much information
* as possible from the provided swt Font
.
*
* @param device The swt device to draw on (display or gc device).
* @param font The swt font to convert.
* @return An awt font converted from the provided swt font.
*/
public static java.awt.Font toAwtFont(Device device, Font font) {
FontData fontData = font.getFontData()[0];
return toAwtFont(device, fontData, true);
}
/**
* Creates an awt color instance to match the rgb values
* of the specified swt color.
*
* @param color The swt color to match.
* @return an awt color abject.
*/
public static java.awt.Color toAwtColor(Color color) {
return new java.awt.Color(color.getRed(), color.getGreen(),
color.getBlue());
}
/**
* Creates a swt color instance to match the rgb values
* of the specified awt paint. For now, this method test
* if the paint is a color and then return the adequate
* swt color. Otherwise plain black is assumed.
*
* @param device The swt device to draw on (display or gc device).
* @param paint The awt color to match.
* @return a swt color object.
*/
public static Color toSwtColor(Device device, java.awt.Paint paint) {
java.awt.Color color;
if (paint instanceof java.awt.Color) {
color = (java.awt.Color) paint;
}
else {
try {
throw new Exception("only color is supported at present... "
+ "setting paint to uniform black color");
}
catch (Exception e) {
e.printStackTrace();
color = new java.awt.Color(0, 0, 0);
}
}
return new org.eclipse.swt.graphics.Color(device,
color.getRed(), color.getGreen(), color.getBlue());
}
}</source>
17. Create an awt font by converting as much information as possible from the provided swt FontData.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel(); /** * Create aFontData
object which encapsulate * the essential data to create a swt font. The data is taken * from the provided awt Font. * <p>Generally speaking, given a font size, the returned swt font * will display differently on the screen than the awt one. * Because the SWT toolkit use native graphical resources whenever * it is possible, this fact is platform dependent. To address * this issue, it is possible to enforce the method to return * a font with the same size (or at least as close as possible) * as the awt one. * <p>When the object is no more used, the user must explicitly * call the dispose method on the returned font to free the * operating system resources (the garbage collector won"t do it). * * @param device The swt device to draw on (display or gc device). * @param font The awt font from which to get the data. * @param ensureSameSize A boolean used to enforce the same size * (in pixels) between the awt font and the newly created swt font. * @return aFontData
object. */ public static FontData toSwtFontData(Device device, java.awt.Font font, boolean ensureSameSize) { FontData fontData = new FontData(); fontData.setName(font.getFamily()); // SWT and AWT share the same style constants. fontData.setStyle(font.getStyle()); // convert the font size (in pt for awt) to height in pixels for swt int height = (int) Math.round(font.getSize() * 72.0 / device.getDPI().y); fontData.setHeight(height); // hack to ensure the newly created swt fonts will be rendered with the // same height as the awt one if (ensureSameSize) { GC tmpGC = new GC(device); Font tmpFont = new Font(device, fontData); tmpGC.setFont(tmpFont); if (tmpGC.textExtent(Az).x > DUMMY_PANEL.getFontMetrics(font).stringWidth(Az)) { while (tmpGC.textExtent(Az).x > DUMMY_PANEL.getFontMetrics(font).stringWidth(Az)) { tmpFont.dispose(); height--; fontData.setHeight(height); tmpFont = new Font(device, fontData); tmpGC.setFont(tmpFont); } } else if (tmpGC.textExtent(Az).x < DUMMY_PANEL.getFontMetrics(font).stringWidth(Az)) { while (tmpGC.textExtent(Az).x < DUMMY_PANEL.getFontMetrics(font).stringWidth(Az)) { tmpFont.dispose(); height++; fontData.setHeight(height); tmpFont = new Font(device, fontData); tmpGC.setFont(tmpFont); } } tmpFont.dispose(); tmpGC.dispose(); } return fontData; } /** * Create an awt font by converting as much information * as possible from the provided swtFontData
. * <p>Generally speaking, given a font size, an swt font will * display differently on the screen than the corresponding awt * one. Because the SWT toolkit use native graphical ressources whenever * it is possible, this fact is platform dependent. To address * this issue, it is possible to enforce the method to return * an awt font with the same height as the swt one. * * @param device The swt device being drawn on (display or gc device). * @param fontData The swt font to convert. * @param ensureSameSize A boolean used to enforce the same size * (in pixels) between the swt font and the newly created awt font. * @return An awt font converted from the provided swt font. */ public static java.awt.Font toAwtFont(Device device, FontData fontData, boolean ensureSameSize) { int height = (int) Math.round(fontData.getHeight() * device.getDPI().y / 72.0); // hack to ensure the newly created awt fonts will be rendered with the // same height as the swt one if (ensureSameSize) { GC tmpGC = new GC(device); Font tmpFont = new Font(device, fontData); tmpGC.setFont(tmpFont); JPanel DUMMY_PANEL = new JPanel(); java.awt.Font tmpAwtFont = new java.awt.Font(fontData.getName(), fontData.getStyle(), height); if (DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(Az) > tmpGC.textExtent(Az).x) { while (DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(Az) > tmpGC.textExtent(Az).x) { height--; tmpAwtFont = new java.awt.Font(fontData.getName(), fontData.getStyle(), height); } } else if (DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(Az) < tmpGC.textExtent(Az).x) { while (DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(Az) < tmpGC.textExtent(Az).x) { height++; tmpAwtFont = new java.awt.Font(fontData.getName(), fontData.getStyle(), height); } } tmpFont.dispose(); tmpGC.dispose(); } return new java.awt.Font(fontData.getName(), fontData.getStyle(), height); }
}</source>
17. Creates an awt color instance to match the rgb values of the specified swt color.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/**
* Create an awt font by converting as much information
* as possible from the provided swt Font
.
*
* @param device The swt device to draw on (display or gc device).
* @param font The swt font to convert.
* @return An awt font converted from the provided swt font.
*/
public static java.awt.Font toAwtFont(Device device, Font font) {
FontData fontData = font.getFontData()[0];
return toAwtFont(device, fontData, true);
}
/**
* Creates an awt color instance to match the rgb values
* of the specified swt color.
*
* @param color The swt color to match.
* @return an awt color abject.
*/
public static java.awt.Color toAwtColor(Color color) {
return new java.awt.Color(color.getRed(), color.getGreen(),
color.getBlue());
}
/**
* Creates a swt color instance to match the rgb values
* of the specified awt paint. For now, this method test
* if the paint is a color and then return the adequate
* swt color. Otherwise plain black is assumed.
*
* @param device The swt device to draw on (display or gc device).
* @param paint The awt color to match.
* @return a swt color object.
*/
public static Color toSwtColor(Device device, java.awt.Paint paint) {
java.awt.Color color;
if (paint instanceof java.awt.Color) {
color = (java.awt.Color) paint;
}
else {
try {
throw new Exception("only color is supported at present... "
+ "setting paint to uniform black color");
}
catch (Exception e) {
e.printStackTrace();
color = new java.awt.Color(0, 0, 0);
}
}
return new org.eclipse.swt.graphics.Color(device,
color.getRed(), color.getGreen(), color.getBlue());
}
}</source>
17. Creates an AWT MouseEvent from a swt event.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/** * Creates an AWTMouseEvent
from a swt event. * This method helps passing SWT mouse event to awt components. * @param event The swt event. * @return A AWT mouse event based on the given SWT event. */ public static MouseEvent toAwtMouseEvent(org.eclipse.swt.events.MouseEvent event) { int button = MouseEvent.NOBUTTON; switch (event.button) { case 1: button = MouseEvent.BUTTON1; break; case 2: button = MouseEvent.BUTTON2; break; case 3: button = MouseEvent.BUTTON3; break; } int modifiers = 0; if ((event.stateMask & SWT.CTRL) != 0) { modifiers |= InputEvent.CTRL_DOWN_MASK; } if ((event.stateMask & SWT.SHIFT) != 0) { modifiers |= InputEvent.SHIFT_DOWN_MASK; } if ((event.stateMask & SWT.ALT) != 0) { modifiers |= InputEvent.ALT_DOWN_MASK; } MouseEvent awtMouseEvent = new MouseEvent(DUMMY_PANEL, event.hashCode(), event.time, modifiers, event.x, event.y, 1, false, button); return awtMouseEvent; } /** * Converts an AWT image to SWT. * * @param image the image (null
not permitted). * * @return Image data. */ public static ImageData convertAWTImageToSWT(Image image) { if (image == null) { throw new IllegalArgumentException("Null "image" argument."); } int w = image.getWidth(null); int h = image.getHeight(null); if (w == -1 || h == -1) { return null; } BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics g = bi.getGraphics(); g.drawImage(image, 0, 0, null); g.dispose(); return convertToSWT(bi); } /** * Converts a buffered image to SWTImageData
. * * @param bufferedImage the buffered image (null
not * permitted). * * @return The image data. */ public static ImageData convertToSWT(BufferedImage bufferedImage) { if (bufferedImage.getColorModel() instanceof DirectColorModel) { DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel(); PaletteData palette = new PaletteData(colorModel.getRedMask(), colorModel.getGreenMask(), colorModel.getBlueMask()); ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette); WritableRaster raster = bufferedImage.getRaster(); int[] pixelArray = new int[3]; for (int y = 0; y < data.height; y++) { for (int x = 0; x < data.width; x++) { raster.getPixel(x, y, pixelArray); int pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1], pixelArray[2])); data.setPixel(x, y, pixel); } } return data; } else if (bufferedImage.getColorModel() instanceof IndexColorModel) { IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel(); int size = colorModel.getMapSize(); byte[] reds = new byte[size]; byte[] greens = new byte[size]; byte[] blues = new byte[size]; colorModel.getReds(reds); colorModel.getGreens(greens); colorModel.getBlues(blues); RGB[] rgbs = new RGB[size]; for (int i = 0; i < rgbs.length; i++) { rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, blues[i] & 0xFF); } PaletteData palette = new PaletteData(rgbs); ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette); data.transparentPixel = colorModel.getTransparentPixel(); WritableRaster raster = bufferedImage.getRaster(); int[] pixelArray = new int[1]; for (int y = 0; y < data.height; y++) { for (int x = 0; x < data.width; x++) { raster.getPixel(x, y, pixelArray); data.setPixel(x, y, pixelArray[0]); } } return data; } return null; }
}</source>
17. Creates a swt color instance to match the rgb values of the specified awt color. alpha channel is not supported.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/** * Creates a swt color instance to match the rgb values * of the specified awt color. alpha channel is not supported. * Note that the dispose method will need to be called on the * returned object. * * @param device The swt device to draw on (display or gc device). * @param color The awt color to match. * @return a swt color object. */ public static Color toSwtColor(Device device, java.awt.Color color) { return new org.eclipse.swt.graphics.Color(device, color.getRed(), color.getGreen(), color.getBlue()); } /** * Transform an awt Rectangle2d instance into a swt one. * The coordinates are rounded to integer for the swt object. * @param rect2d The awt rectangle to map. * @return an swtRectangle
object. */ public static Rectangle toSwtRectangle(Rectangle2D rect2d) { return new Rectangle( (int) Math.round(rect2d.getMinX()), (int) Math.round(rect2d.getMinY()), (int) Math.round(rect2d.getWidth()), (int) Math.round(rect2d.getHeight())); } /** * Transform a swt Rectangle instance into an awt one. * @param rect the swtRectangle
* @return a Rectangle2D.Double instance with * the eappropriate location and size. */ public static Rectangle2D toAwtRectangle(Rectangle rect) { Rectangle2D rect2d = new Rectangle2D.Double(); rect2d.setRect(rect.x, rect.y, rect.width, rect.height); return rect2d; } /** * Returns an AWT point with the same coordinates as the specified * SWT point. * * @param p the SWT point (null
not permitted). * * @return An AWT point with the same coordinates asp
. * * @see #toSwtPoint(java.awt.Point) */ public static Point2D toAwtPoint(Point p) { return new java.awt.Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified * AWT point. * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.Point p) { return new Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified AWT * point (rounded to integer values). * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.geom.Point2D p) { return new Point((int) Math.round(p.getX()), (int) Math.round(p.getY())); }
}</source>
17. Creates a swt color instance to match the rgb values of the specified awt paint.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/**
* Create an awt font by converting as much information
* as possible from the provided swt Font
.
*
* @param device The swt device to draw on (display or gc device).
* @param font The swt font to convert.
* @return An awt font converted from the provided swt font.
*/
public static java.awt.Font toAwtFont(Device device, Font font) {
FontData fontData = font.getFontData()[0];
return toAwtFont(device, fontData, true);
}
/**
* Creates an awt color instance to match the rgb values
* of the specified swt color.
*
* @param color The swt color to match.
* @return an awt color abject.
*/
public static java.awt.Color toAwtColor(Color color) {
return new java.awt.Color(color.getRed(), color.getGreen(),
color.getBlue());
}
/**
* Creates a swt color instance to match the rgb values
* of the specified awt paint. For now, this method test
* if the paint is a color and then return the adequate
* swt color. Otherwise plain black is assumed.
*
* @param device The swt device to draw on (display or gc device).
* @param paint The awt color to match.
* @return a swt color object.
*/
public static Color toSwtColor(Device device, java.awt.Paint paint) {
java.awt.Color color;
if (paint instanceof java.awt.Color) {
color = (java.awt.Color) paint;
}
else {
try {
throw new Exception("only color is supported at present... "
+ "setting paint to uniform black color");
}
catch (Exception e) {
e.printStackTrace();
color = new java.awt.Color(0, 0, 0);
}
}
return new org.eclipse.swt.graphics.Color(device,
color.getRed(), color.getGreen(), color.getBlue());
}
}</source>
17. Draw Graphics2D stuff on a swt composite
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------------ * SWTGraphics2D.java * ------------------ * (C) Copyright 2006-2008, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Cedric Chabanois (cchabanois AT no-log.org); * David Gilbert (for Object Refinery Limited); * Ronnie Duan (see bug report 2583891); * * Changes * ------- * 14-Jun-2006 : New class (HP); * 29-Jan-2007 : Fixed the fillRect method (HP); * 31-Jan-2007 : Moved the dummy JPanel to SWTUtils.java, * implemented the drawLine method (HP); * 07-Apr-2007 : Dispose some of the swt ressources, * thanks to silent for pointing this out (HP); * 23-May-2007 : Removed resource leaks by adding a resource pool (CC); * 15-Jun-2007 : Fixed compile error for JDK 1.4 (DG); * 22-Oct-2007 : Implemented clipping (HP); * 22-Oct-2007 : Implemented some AlphaComposite support (HP); * 23-Oct-2007 : Added mechanism for storing RenderingHints (which are * still ignored at this point) (DG); * 23-Oct-2007 : Implemented drawPolygon(), drawPolyline(), drawOval(), * fillOval(), drawArc() and fillArc() (DG); * 27-Nov-2007 : Implemented a couple of drawImage() methods (DG); * 18-Nov-2008 : Check for GradientPaint in setPaint() method (DG); * 27-Feb-2009 : Implemented fillPolygon() - see bug 2583891 (DG); * */
import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; import java.awt.ruposite; import java.awt.Font; import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.Image; import java.awt.Paint; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.Stroke; import java.awt.RenderingHints.Key; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.geom.AffineTransform; import java.awt.geom.PathIterator; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ImageObserver; import java.awt.image.RenderedImage; import java.awt.image.renderable.RenderableImage; import java.text.AttributedCharacterIterator; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Path; import org.eclipse.swt.graphics.Resource; import org.eclipse.swt.graphics.Transform; /**
* This is a class utility to draw Graphics2D stuff on a swt composite. * It is presently developed to use JFreeChart with the Standard * Widget Toolkit but may be of a wider use later. */
public class SWTGraphics2D extends Graphics2D {
/** The swt graphic composite */ private GC gc; /** * The rendering hints. For now, these are not used, but at least the * basic mechanism is present. */ private RenderingHints hints; /** A reference to the compositing rule to apply. This is necessary * due to the poor compositing interface of the SWT toolkit. */ private java.awt.ruposite composite; /** A HashMap to store the Swt color resources. */ private Map colorsPool = new HashMap(); /** A HashMap to store the Swt font resources. */ private Map fontsPool = new HashMap(); /** A HashMap to store the Swt transform resources. */ private Map transformsPool = new HashMap(); /** A List to store the Swt resources. */ private List resourcePool = new ArrayList(); /** * Creates a new instance. * * @param gc the graphics context. */ public SWTGraphics2D(GC gc) { super(); this.gc = gc; this.hints = new RenderingHints(null); this.ruposite = AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f); } /** * Not implemented yet - see {@link Graphics#create()}. * * @returnnull
. */ public Graphics create() { // TODO Auto-generated method stub return null; } /** * Not implemented yet - see {@link Graphics2D#getDeviceConfiguration()}. * * @returnnull
. */ public GraphicsConfiguration getDeviceConfiguration() { // TODO Auto-generated method stub return null; } /** * Returns the current value for the specified hint key, or *null
if no value is set. * * @param hintKey the hint key (null
permitted). * * @return The hint value, ornull
. * * @see #setRenderingHint(RenderingHints.Key, Object) */ public Object getRenderingHint(Key hintKey) { return this.hints.get(hintKey); } /** * Sets the value for a rendering hint. For now, this graphics context * ignores all hints. * * @param hintKey the key (null
not permitted). * @param hintValue the value (must be compatible with the specified key). * * @throws IllegalArgumentException ifhintValue
is not * compatible with thehintKey
. * * @see #getRenderingHint(RenderingHints.Key) */ public void setRenderingHint(Key hintKey, Object hintValue) { this.hints.put(hintKey, hintValue); } /** * Returns a copy of the hints collection for this graphics context. * * @return A copy of the hints collection. */ public RenderingHints getRenderingHints() { return (RenderingHints) this.hints.clone(); } /** * Adds the hints in the specified map to the graphics context, replacing * any existing hints. For now, this graphics context ignores all hints. * * @param hints the hints (null
not permitted). * * @see #setRenderingHints(Map) */ public void addRenderingHints(Map hints) { this.hints.putAll(hints); } /** * Replaces the existing hints with those contained in the specified * map. Note that, for now, this graphics context ignores all hints. * * @param hints the hints (null
not permitted). * * @see #addRenderingHints(Map) */ public void setRenderingHints(Map hints) { if (hints == null) { throw new NullPointerException("Null "hints" argument."); } this.hints = new RenderingHints(hints); } /** * Returns the current paint for this graphics context. * * @return The current paint. * * @see #setPaint(Paint) */ public Paint getPaint() { // TODO: it might be a good idea to keep a reference to the color // specified in setPaint() or setColor(), rather than creating a // new object every time getPaint() is called. return SWTUtils.toAwtColor(this.gc.getForeground()); } /** * Sets the paint for this graphics context. For now, this graphics * context only supports instances of {@link Color} or * {@link GradientPaint} (in the latter case there is no real gradient * support, the paint used is theColor
returned by *getColor1()
). * * @param paint the paint (null
not permitted). * * @see #getPaint() * @see #setColor(Color) */ public void setPaint(Paint paint) { if (paint instanceof Color) { setColor((Color) paint); } else if (paint instanceof GradientPaint) { GradientPaint gp = (GradientPaint) paint; setColor(gp.getColor1()); } else { throw new RuntimeException("Can only handle "Color" at present."); } } /** * Returns the current color for this graphics context. * * @return The current color. * * @see #setColor(Color) */ public Color getColor() { // TODO: it might be a good idea to keep a reference to the color // specified in setPaint() or setColor(), rather than creating a // new object every time getPaint() is called. return SWTUtils.toAwtColor(this.gc.getForeground()); } /** * Sets the current color for this graphics context. * * @param color the color. * * @see #getColor() */ public void setColor(Color color) { org.eclipse.swt.graphics.Color swtColor = getSwtColorFromPool(color); this.gc.setForeground(swtColor); // handle transparency and compositing. if (this.ruposite instanceof AlphaComposite) { AlphaComposite acomp = (AlphaComposite) this.ruposite; switch (acomp.getRule()) { case AlphaComposite.SRC_OVER: this.gc.setAlpha((int) (color.getAlpha() * acomp.getAlpha())); break; default: this.gc.setAlpha(color.getAlpha()); break; } } } /** * Sets the background colour. * * @param color the colour. */ public void setBackground(Color color) { org.eclipse.swt.graphics.Color swtColor = getSwtColorFromPool(color); this.gc.setBackground(swtColor); } /** * Returns the background colour. * * @return The background colour. */ public Color getBackground() { return SWTUtils.toAwtColor(this.gc.getBackground()); } /** * Not implemented - see {@link Graphics#setPaintMode()}. */ public void setPaintMode() { // TODO Auto-generated method stub } /** * Not implemented - see {@link Graphics#setXORMode(Color)}. * * @param color the colour. */ public void setXORMode(Color color) { // TODO Auto-generated method stub } /** * Returns the current composite. * * @return The current composite. * * @see #setComposite(Composite) */ public Composite getComposite() { return this.ruposite; } /** * Sets the current composite. This implementation currently supports * only the {@link AlphaComposite} class. * * @param comp the composite. */ public void setComposite(Composite comp) { this.ruposite = comp; if (comp instanceof AlphaComposite) { AlphaComposite acomp = (AlphaComposite) comp; int alpha = (int) (acomp.getAlpha() * 0xFF); this.gc.setAlpha(alpha); } else { System.out.println("warning, can only handle alpha composite at the moment."); } } /** * Returns the current stroke for this graphics context. * * @return The current stroke. * * @see #setStroke(Stroke) */ public Stroke getStroke() { return new BasicStroke(this.gc.getLineWidth(), this.gc.getLineCap(), this.gc.getLineJoin()); } /** * Sets the stroke for this graphics context. For now, this implementation * only recognises the {@link BasicStroke} class. * * @param stroke the stroke (null
not permitted). * * @see #getStroke() */ public void setStroke(Stroke stroke) { if (stroke instanceof BasicStroke) { BasicStroke bs = (BasicStroke) stroke; // linewidth this.gc.setLineWidth((int) bs.getLineWidth()); // line join switch (bs.getLineJoin()) { case BasicStroke.JOIN_BEVEL : this.gc.setLineJoin(SWT.JOIN_BEVEL); break; case BasicStroke.JOIN_MITER : this.gc.setLineJoin(SWT.JOIN_MITER); break; case BasicStroke.JOIN_ROUND : this.gc.setLineJoin(SWT.JOIN_ROUND); break; } // line cap switch (bs.getEndCap()) { case BasicStroke.CAP_BUTT : this.gc.setLineCap(SWT.CAP_FLAT); break; case BasicStroke.CAP_ROUND : this.gc.setLineCap(SWT.CAP_ROUND); break; case BasicStroke.CAP_SQUARE : this.gc.setLineCap(SWT.CAP_SQUARE); break; } // set the line style to solid by default this.gc.setLineStyle(SWT.LINE_SOLID); // apply dash style if any float[] dashes = bs.getDashArray(); if (dashes != null) { int[] swtDashes = new int[dashes.length]; for (int i = 0; i < swtDashes.length; i++) { swtDashes[i] = (int) dashes[i]; } this.gc.setLineDash(swtDashes); } } else { throw new RuntimeException( "Can only handle "Basic Stroke" at present."); } } /** * Applies the specified clip. * * @param s the shape for the clip. */ public void clip(Shape s) { Path path = toSwtPath(s); this.gc.setClipping(path); path.dispose(); } /** * Returns the clip bounds. * * @return The clip bounds. */ public Rectangle getClipBounds() { org.eclipse.swt.graphics.Rectangle clip = this.gc.getClipping(); return new Rectangle(clip.x, clip.y, clip.width, clip.height); } /** * Sets the clipping to the intersection of the current clip region and * the specified rectangle. * * @param x the x-coordinate. * @param y the y-coordinate. * @param width the width. * @param height the height. */ public void clipRect(int x, int y, int width, int height) { org.eclipse.swt.graphics.Rectangle clip = this.gc.getClipping(); clip.intersects(x, y, width, height); this.gc.setClipping(clip); } /** * Returns the current clip. * * @return The current clip. */ public Shape getClip() { return SWTUtils.toAwtRectangle(this.gc.getClipping()); } /** * Sets the clip region. * * @param clip the clip. */ public void setClip(Shape clip) { if (clip == null) { return; } Path clipPath = toSwtPath(clip); this.gc.setClipping(clipPath); clipPath.dispose(); } /** * Sets the clip region to the specified rectangle. * * @param x the x-coordinate. * @param y the y-coordinate. * @param width the width. * @param height the height. */ public void setClip(int x, int y, int width, int height) { this.gc.setClipping(x, y, width, height); } /** * Returns the current transform. * * @return The current transform. */ public AffineTransform getTransform() { Transform swtTransform = new Transform(this.gc.getDevice()); this.gc.getTransform(swtTransform); AffineTransform awtTransform = toAwtTransform(swtTransform); swtTransform.dispose(); return awtTransform; } /** * Sets the current transform. * * @param t the transform. */ public void setTransform(AffineTransform t) { Transform transform = getSwtTransformFromPool(t); this.gc.setTransform(transform); } /** * Concatenates the specified transform to the existing transform. * * @param t the transform. */ public void transform(AffineTransform t) { Transform swtTransform = new Transform(this.gc.getDevice()); this.gc.getTransform(swtTransform); swtTransform.multiply(getSwtTransformFromPool(t)); this.gc.setTransform(swtTransform); swtTransform.dispose(); } /** * Applies a translation. * * @param x the translation along the x-axis. * @param y the translation along the y-axis. */ public void translate(int x, int y) { Transform swtTransform = new Transform(this.gc.getDevice()); this.gc.getTransform(swtTransform); swtTransform.translate(x, y); this.gc.setTransform(swtTransform); swtTransform.dispose(); } /** * Applies a translation. * * @param tx the translation along the x-axis. * @param ty the translation along the y-axis. */ public void translate(double tx, double ty) { translate((int) tx, (int) ty); } /** * Applies a rotation transform. * * @param theta the angle of rotation. */ public void rotate(double theta) { Transform swtTransform = new Transform(this.gc.getDevice()); this.gc.getTransform(swtTransform); swtTransform.rotate((float) (theta * 180 / Math.PI)); this.gc.setTransform(swtTransform); swtTransform.dispose(); } /** * Not implemented - see {@link Graphics2D#rotate(double, double, double)}. * * @see java.awt.Graphics2D#rotate(double, double, double) */ public void rotate(double theta, double x, double y) { // TODO Auto-generated method stub } /** * Applies a scale transform. * * @param scaleX the scale factor along the x-axis. * @param scaleY the scale factor along the y-axis. */ public void scale(double scaleX, double scaleY) { Transform swtTransform = new Transform(this.gc.getDevice()); this.gc.getTransform(swtTransform); swtTransform.scale((float) scaleX, (float) scaleY); this.gc.setTransform(swtTransform); swtTransform.dispose(); } /** * Applies a shear transform. * * @param shearX the x-factor. * @param shearY the y-factor. */ public void shear(double shearX, double shearY) { Transform swtTransform = new Transform(this.gc.getDevice()); this.gc.getTransform(swtTransform); Transform shear = new Transform(this.gc.getDevice(), 1f, (float) shearX, (float) shearY, 1f, 0, 0); swtTransform.multiply(shear); this.gc.setTransform(swtTransform); swtTransform.dispose(); } /** * Draws the outline of the specified shape using the current stroke and * paint settings. * * @param shape the shape (null
not permitted). * * @see #getPaint() * @see #getStroke() * @see #fill(Shape) */ public void draw(Shape shape) { Path path = toSwtPath(shape); this.gc.drawPath(path); path.dispose(); } /** * Draws a line from (x1, y1) to (x2, y2) using the current stroke * and paint settings. * * @param x1 the x-coordinate for the starting point. * @param y1 the y-coordinate for the starting point. * @param x2 the x-coordinate for the ending point. * @param y2 the y-coordinate for the ending point. * * @see #draw(Shape) */ public void drawLine(int x1, int y1, int x2, int y2) { this.gc.drawLine(x1, y1, x2, y2); } /** * Draws the outline of the polygon specified by the given points, using * the current paint and stroke settings. * * @param xPoints the x-coordinates. * @param yPoints the y-coordinates. * @param npoints the number of points in the polygon. * * @see #draw(Shape) */ public void drawPolygon(int [] xPoints, int [] yPoints, int npoints) { drawPolyline(xPoints, yPoints, npoints); if (npoints > 1) { this.gc.drawLine(xPoints[npoints - 1], yPoints[npoints - 1], xPoints[0], yPoints[0]); } } /** * Draws a sequence of connected lines specified by the given points, using * the current paint and stroke settings. * * @param xPoints the x-coordinates. * @param yPoints the y-coordinates. * @param npoints the number of points in the polygon. * * @see #draw(Shape) */ public void drawPolyline(int [] xPoints, int [] yPoints, int npoints) { if (npoints > 1) { int x0 = xPoints[0]; int y0 = yPoints[0]; int x1 = 0, y1 = 0; for (int i = 1; i < npoints; i++) { x1 = xPoints[i]; y1 = yPoints[i]; this.gc.drawLine(x0, y0, x1, y1); x0 = x1; y0 = y1; } } } /** * Draws an oval that fits within the specified rectangular region. * * @param x the x-coordinate. * @param y the y-coordinate. * @param width the frame width. * @param height the frame height. * * @see #fillOval(int, int, int, int) * @see #draw(Shape) */ public void drawOval(int x, int y, int width, int height) { this.gc.drawOval(x, y, width - 1, height - 1); } /** * Draws an arc that is part of an ellipse that fits within the specified * framing rectangle. * * @param x the x-coordinate. * @param y the y-coordinate. * @param width the frame width. * @param height the frame height. * @param arcStart the arc starting point, in degrees. * @param arcAngle the extent of the arc. * * @see #fillArc(int, int, int, int, int, int) */ public void drawArc(int x, int y, int width, int height, int arcStart, int arcAngle) { this.gc.drawArc(x, y, width - 1, height - 1, arcStart, arcAngle); } /** * Draws a rectangle with rounded corners that fits within the specified * framing rectangle. * * @param x the x-coordinate. * @param y the y-coordinate. * @param width the frame width. * @param height the frame height. * @param arcWidth the width of the arc defining the roundedness of the * rectangle"s corners. * @param arcHeight the height of the arc defining the roundedness of the * rectangle"s corners. * * @see #fillRoundRect(int, int, int, int, int, int) */ public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { this.gc.drawRoundRectangle(x, y, width - 1, height - 1, arcWidth, arcHeight); } /** * Fills the specified shape using the current paint. * * @param shape the shape (null
not permitted). * * @see #getPaint() * @see #draw(Shape) */ public void fill(Shape shape) { Path path = toSwtPath(shape); // Note that for consistency with the AWT implementation, it is // necessary to switch temporarily the foreground and background // colours switchColors(); this.gc.fillPath(path); switchColors(); path.dispose(); } /** * Fill a rectangle area on the swt graphic composite. * ThefillRectangle
method of theGC
* class uses the background color so we must switch colors. * @see java.awt.Graphics#fillRect(int, int, int, int) */ public void fillRect(int x, int y, int width, int height) { this.switchColors(); this.gc.fillRectangle(x, y, width, height); this.switchColors(); } /** * Fills the specified rectangle with the current background colour. * * @param x the x-coordinate for the rectangle. * @param y the y-coordinate for the rectangle. * @param width the width. * @param height the height. * * @see #fillRect(int, int, int, int) */ public void clearRect(int x, int y, int width, int height) { Paint saved = getPaint(); setPaint(getBackground()); fillRect(x, y, width, height); setPaint(saved); } /** * Fills the specified polygon. * * @param xPoints the x-coordinates. * @param yPoints the y-coordinates. * @param npoints the number of points. */ public void fillPolygon(int[] xPoints, int[] yPoints, int npoints) { int[] pointArray = new int[npoints * 2]; for (int i = 0; i < npoints; i++) { pointArray[2 * i] = xPoints[i]; pointArray[2 * i + 1] = yPoints[i]; } switchColors(); this.gc.fillPolygon(pointArray); switchColors(); } /** * Draws a rectangle with rounded corners that fits within the specified * framing rectangle. * * @param x the x-coordinate. * @param y the y-coordinate. * @param width the frame width. * @param height the frame height. * @param arcWidth the width of the arc defining the roundedness of the * rectangle"s corners. * @param arcHeight the height of the arc defining the roundedness of the * rectangle"s corners. * * @see #drawRoundRect(int, int, int, int, int, int) */ public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { switchColors(); this.gc.fillRoundRectangle(x, y, width - 1, height - 1, arcWidth, arcHeight); switchColors(); } /** * Fills an oval that fits within the specified rectangular region. * * @param x the x-coordinate. * @param y the y-coordinate. * @param width the frame width. * @param height the frame height. * * @see #drawOval(int, int, int, int) * @see #fill(Shape) */ public void fillOval(int x, int y, int width, int height) { switchColors(); this.gc.fillOval(x, y, width - 1, height - 1); switchColors(); } /** * Fills an arc that is part of an ellipse that fits within the specified * framing rectangle. * * @param x the x-coordinate. * @param y the y-coordinate. * @param width the frame width. * @param height the frame height. * @param arcStart the arc starting point, in degrees. * @param arcAngle the extent of the arc. * * @see #drawArc(int, int, int, int, int, int) */ public void fillArc(int x, int y, int width, int height, int arcStart, int arcAngle) { switchColors(); this.gc.fillArc(x, y, width - 1, height - 1, arcStart, arcAngle); switchColors(); } /** * Returns the font in form of an awt font created * with the parameters of the font of the swt graphic * composite. * @see java.awt.Graphics#getFont() */ public Font getFont() { // retrieve the swt font description in an os indept way FontData[] fontData = this.gc.getFont().getFontData(); // create a new awt font with the appropiate data return SWTUtils.toAwtFont(this.gc.getDevice(), fontData[0], true); } /** * Set the font swt graphic composite from the specified * awt font. Be careful that the newly created swt font * must be disposed separately. * @see java.awt.Graphics#setFont(java.awt.Font) */ public void setFont(Font font) { org.eclipse.swt.graphics.Font swtFont = getSwtFontFromPool(font); this.gc.setFont(swtFont); } /** * Returns the font metrics. * * @param font the font. * * @return The font metrics. */ public FontMetrics getFontMetrics(Font font) { return SWTUtils.DUMMY_PANEL.getFontMetrics(font); } /** * Returns the font render context. * * @return The font render context. */ public FontRenderContext getFontRenderContext() { FontRenderContext fontRenderContext = new FontRenderContext( new AffineTransform(), true, true); return fontRenderContext; } /** * Not implemented - see {@link Graphics2D#drawGlyphVector(GlyphVector, * float, float)}. */ public void drawGlyphVector(GlyphVector g, float x, float y) { // TODO Auto-generated method stub } /** * Draws a string on the receiver. note that * to be consistent with the awt method, * the y has to be modified with the ascent of the font. * * @see java.awt.Graphics#drawString(java.lang.String, int, int) */ public void drawString(String text, int x, int y) { float fm = this.gc.getFontMetrics().getAscent(); this.gc.drawString(text, x, (int) (y - fm), true); } /** * Draws a string at the specified position. * * @param text the string. * @param x the x-coordinate. * @param y the y-coordinate. */ public void drawString(String text, float x, float y) { float fm = this.gc.getFontMetrics().getAscent(); this.gc.drawString(text, (int) x, (int) (y - fm), true); } /** * Draws a string at the specified position. * * @param iterator the string. * @param x the x-coordinate. * @param y the y-coordinate. */ public void drawString(AttributedCharacterIterator iterator, int x, int y) { // TODO Auto-generated method stub } /** * Draws a string at the specified position. * * @param iterator the string. * @param x the x-coordinate. * @param y the y-coordinate. */ public void drawString(AttributedCharacterIterator iterator, float x, float y) { // TODO Auto-generated method stub } /** * Not implemented - see {@link Graphics2D#hit(Rectangle, Shape, boolean)}. * * @returnfalse
. */ public boolean hit(Rectangle rect, Shape text, boolean onStroke) { // TODO Auto-generated method stub return false; } /** * Not implemented - see {@link Graphics#copyArea(int, int, int, int, int, * int)}. */ public void copyArea(int x, int y, int width, int height, int dx, int dy) { // TODO Auto-generated method stub } /** * Not implemented - see {@link Graphics2D#drawImage(Image, * AffineTransform, ImageObserver)}. * * @param image the image. * @param xform the transform. * @param obs an image observer. * * @return A boolean. */ public boolean drawImage(Image image, AffineTransform xform, ImageObserver obs) { // TODO Auto-generated method stub return false; } /** * Draws an image. * * @param image the image. * @param op the image operation. * @param x the x-coordinate. * @param y the y-coordinate. */ public void drawImage(BufferedImage image, BufferedImageOp op, int x, int y) { org.eclipse.swt.graphics.Image im = new org.eclipse.swt.graphics.Image( this.gc.getDevice(), SWTUtils.convertToSWT(image)); this.gc.drawImage(im, x, y); im.dispose(); } /** * Draws an SWT image with the top left corner of the image aligned to the * point (x, y). * * @param image the image. * @param x the x-coordinate. * @param y the y-coordinate. */ public void drawImage(org.eclipse.swt.graphics.Image image, int x, int y) { this.gc.drawImage(image, x, y); } /** * Not implemented - see {@link Graphics2D#drawRenderedImage(RenderedImage, * AffineTransform)}. * * @param image the image. * @param xform the transform. */ public void drawRenderedImage(RenderedImage image, AffineTransform xform) { // TODO Auto-generated method stub } /** * Not implemented - see {@link Graphics2D#drawRenderableImage( * RenderableImage, AffineTransform)}. * * @param image the image. * @param xform the transform. */ public void drawRenderableImage(RenderableImage image, AffineTransform xform) { // TODO Auto-generated method stub } /** * Draws an image with the top left corner aligned to the point (x, y). * * @param image the image. * @param x the x-coordinate. * @param y the y-coordinate. * @param observer ignored here. * * @returntrue
if the image has been drawn. */ public boolean drawImage(Image image, int x, int y, ImageObserver observer) { ImageData data = SWTUtils.convertAWTImageToSWT(image); if (data == null) { return false; } org.eclipse.swt.graphics.Image im = new org.eclipse.swt.graphics.Image( this.gc.getDevice(), data); this.gc.drawImage(im, x, y); im.dispose(); return true; } /** * Draws an image with the top left corner aligned to the point (x, y), * and scaled to the specified width and height. * * @param image the image. * @param x the x-coordinate. * @param y the y-coordinate. * @param width the width for the rendered image. * @param height the height for the rendered image. * @param observer ignored here. * * @returntrue
if the image has been drawn. */ public boolean drawImage(Image image, int x, int y, int width, int height, ImageObserver observer) { ImageData data = SWTUtils.convertAWTImageToSWT(image); if (data == null) { return false; } org.eclipse.swt.graphics.Image im = new org.eclipse.swt.graphics.Image( this.gc.getDevice(), data); org.eclipse.swt.graphics.Rectangle bounds = im.getBounds(); this.gc.drawImage(im, 0, 0, bounds.width, bounds.height, x, y, width, height); im.dispose(); return true; } /** * Draws an image. * * @param image (null
not permitted). * @param x the x-coordinate. * @param y the y-coordinate. * @param bgcolor the background color. * @param observer an image observer. * * @return A boolean. */ public boolean drawImage(Image image, int x, int y, Color bgcolor, ImageObserver observer) { if (image == null) { throw new IllegalArgumentException("Null "image" argument."); } int w = image.getWidth(null); int h = image.getHeight(null); if (w == -1 || h == -1) { return false; } Paint savedPaint = getPaint(); fill(new Rectangle2D.Double(x, y, w, h)); setPaint(savedPaint); return drawImage(image, x, y, observer); } /** * Draws an image. * * @param image the image (null
not permitted). * @param x the x-coordinate. * @param y the y-coordinate. * @param width the width. * @param height the height. * @param bgcolor the background colour. * @param observer an image observer. * * @return A boolean. */ public boolean drawImage(Image image, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) { if (image == null) { throw new IllegalArgumentException("Null "image" argument."); } int w = image.getWidth(null); int h = image.getHeight(null); if (w == -1 || h == -1) { return false; } Paint savedPaint = getPaint(); fill(new Rectangle2D.Double(x, y, w, h)); setPaint(savedPaint); return drawImage(image, x, y, width, height, observer); } /** * Not implemented - see {@link Graphics#drawImage(Image, int, int, int, * int, int, int, int, int, ImageObserver)}. * * @param image the image. * @param dx1 * @param dy1 * @param dx2 * @param dy2 * @param sx1 * @param sy1 * @param sx2 * @param sy2 * @param observer */ public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) { // TODO Auto-generated method stub return false; } /** * Not implemented - see {@link Graphics#drawImage(Image, int, int, int, * int, int, int, int, int, Color, ImageObserver)}. * * @param image the image. * @param dx1 * @param dy1 * @param dx2 * @param dy2 * @param sx1 * @param sy1 * @param sx2 * @param sy2 * @param bgcolor * @param observer */ public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) { // TODO Auto-generated method stub return false; } /** * Releases resources held by this instance (but note that the caller * must dispose of the "GC" passed to the constructor). * * @see java.awt.Graphics#dispose() */ public void dispose() { // we dispose resources we own but user must dispose gc disposeResourcePool(); } /** * Add given swt resource to the resource pool. All resources added * to the resource pool will be disposed when {@link #dispose()} is called. * * @param resource the resource to add to the pool. * @return the swtResource
just added. */ private Resource addToResourcePool(Resource resource) { this.resourcePool.add(resource); return resource; } /** * Dispose the resource pool. */ private void disposeResourcePool() { for (Iterator it = this.resourcePool.iterator(); it.hasNext();) { Resource resource = (Resource) it.next(); resource.dispose(); } this.fontsPool.clear(); this.colorsPool.clear(); this.transformsPool.clear(); this.resourcePool.clear(); } /** * Internal method to convert a AWT font object into * a SWT font resource. If a corresponding SWT font * instance is already in the pool, it will be used * instead of creating a new one. This is used in * {@link #setFont()} for instance. * * @param font The AWT font to convert. * @return The SWT font instance. */ private org.eclipse.swt.graphics.Font getSwtFontFromPool(Font font) { org.eclipse.swt.graphics.Font swtFont = (org.eclipse.swt.graphics.Font) this.fontsPool.get(font); if (swtFont == null) { swtFont = new org.eclipse.swt.graphics.Font(this.gc.getDevice(), SWTUtils.toSwtFontData(this.gc.getDevice(), font, true)); addToResourcePool(swtFont); this.fontsPool.put(font, swtFont); } return swtFont; } /** * Internal method to convert a AWT color object into * a SWT color resource. If a corresponding SWT color * instance is already in the pool, it will be used * instead of creating a new one. This is used in * {@link #setColor()} for instance. * * @param awtColor The AWT color to convert. * @return A SWT color instance. */ private org.eclipse.swt.graphics.Color getSwtColorFromPool(Color awtColor) { org.eclipse.swt.graphics.Color swtColor = (org.eclipse.swt.graphics.Color) // we can"t use the following valueOf() method, because it // won"t compile with JDK1.4 // this.colorsPool.get(Integer.valueOf(awtColor.getRGB())); this.colorsPool.get(new Integer(awtColor.getRGB())); if (swtColor == null) { swtColor = SWTUtils.toSwtColor(this.gc.getDevice(), awtColor); addToResourcePool(swtColor); // see comment above //this.colorsPool.put(Integer.valueOf(awtColor.getRGB()), swtColor); this.colorsPool.put(new Integer(awtColor.getRGB()), swtColor); } return swtColor; } /** * Internal method to convert a AWT transform object into * a SWT transform resource. If a corresponding SWT transform * instance is already in the pool, it will be used * instead of creating a new one. This is used in * {@link #setTransform()} for instance. * * @param awtTransform The AWT transform to convert. * @return A SWT transform instance. */ private Transform getSwtTransformFromPool(AffineTransform awtTransform) { Transform t = (Transform) this.transformsPool.get(awtTransform); if (t == null) { t = new Transform(this.gc.getDevice()); double[] matrix = new double[6]; awtTransform.getMatrix(matrix); t.setElements((float) matrix[0], (float) matrix[1], (float) matrix[2], (float) matrix[3], (float) matrix[4], (float) matrix[5]); addToResourcePool(t); this.transformsPool.put(awtTransform, t); } return t; } /** * Perform a switch between foreground and background * color of gc. This is needed for consistency with * the awt behaviour, and is required notably for the * filling methods. */ private void switchColors() { org.eclipse.swt.graphics.Color bg = this.gc.getBackground(); org.eclipse.swt.graphics.Color fg = this.gc.getForeground(); this.gc.setBackground(fg); this.gc.setForeground(bg); } /** * Converts an AWTShape
into a SWTPath
. * * @param shape the shape (null
not permitted). * * @return The path. */ private Path toSwtPath(Shape shape) { int type; float[] coords = new float[6]; Path path = new Path(this.gc.getDevice()); PathIterator pit = shape.getPathIterator(null); while (!pit.isDone()) { type = pit.currentSegment(coords); switch (type) { case (PathIterator.SEG_MOVETO): path.moveTo(coords[0], coords[1]); break; case (PathIterator.SEG_LINETO): path.lineTo(coords[0], coords[1]); break; case (PathIterator.SEG_QUADTO): path.quadTo(coords[0], coords[1], coords[2], coords[3]); break; case (PathIterator.SEG_CUBICTO): path.cubicTo(coords[0], coords[1], coords[2], coords[3], coords[4], coords[5]); break; case (PathIterator.SEG_CLOSE): path.close(); break; default: break; } pit.next(); } return path; } /** * Converts an SWT transform into the equivalent AWT transform. * * @param swtTransform the SWT transform. * * @return The AWT transform. */ private AffineTransform toAwtTransform(Transform swtTransform) { float[] elements = new float[6]; swtTransform.getElements(elements); AffineTransform awtTransform = new AffineTransform(elements); return awtTransform; }
}</source>
17. Embed a JTable in SWT (no flicker)
<source lang="java">
/*******************************************************************************
* Copyright (c) 2000, 2004 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.swt.snippets; /*
* example snippet: embed a JTable in SWT (no flicker) * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ * * @since 3.0 */
import java.awt.BorderLayout; import java.awt.Frame; import java.awt.Panel; import java.util.Vector; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTable; import org.eclipse.swt.SWT; import org.eclipse.swt.awt.SWT_AWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.ruposite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class EmbedJTableSWTNoFlicker {
public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Composite composite = new Composite(shell, SWT.NO_BACKGROUND | SWT.EMBEDDED); /* * Set a Windows specific AWT property that prevents heavyweight components * from erasing their background. Note that this is a global property and * cannot be scoped. It might not be suitable for your application. */ try { System.setProperty("sun.awt.noerasebackground", "true"); } catch (NoSuchMethodError error) { } /* Create and setting up frame */ Frame frame = SWT_AWT.new_Frame(composite); Panel panel = new Panel(new BorderLayout()) { public void update(java.awt.Graphics g) { /* Do not erase the background */ paint(g); } }; frame.add(panel); JRootPane root = new JRootPane(); panel.add(root); java.awt.Container contentPane = root.getContentPane(); /* Creating components */ int nrows = 1000, ncolumns = 10; Vector rows = new Vector(); for (int i = 0; i < nrows; i++) { Vector row = new Vector(); for (int j = 0; j < ncolumns; j++) { row.addElement("Item " + i + "-" + j); } rows.addElement(row); } Vector columns = new Vector(); for (int i = 0; i < ncolumns; i++) { columns.addElement("Column " + i); } JTable table = new JTable(rows, columns); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.createDefaultColumnsFromModel(); JScrollPane scrollPane = new JScrollPane(table); contentPane.setLayout(new BorderLayout()); contentPane.add(scrollPane); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
17. Embeded Swing/AWT components to SWT
<source lang="java">
import javax.swing.JScrollPane; import javax.swing.JTree; import org.eclipse.swt.SWT; import org.eclipse.swt.awt.SWT_AWT; import org.eclipse.swt.widgets.ruposite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class EmbedSwingAWTSWT {
public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setText("SWT and Swing/AWT Example"); Composite treeComp = new Composite(shell, SWT.EMBEDDED); treeComp.setBounds(5,5,300,300); java.awt.Frame fileTableFrame = SWT_AWT.new_Frame(treeComp); java.awt.Panel panel = new java.awt.Panel(new java.awt.BorderLayout()); fileTableFrame.add(panel); JTree fileTable = new JTree(); fileTable.setDoubleBuffered(true); JScrollPane scrollPane = new JScrollPane(fileTable); panel.add(scrollPane); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
17. Returns an AWT point with the same coordinates as the specified SWT point.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/** * Creates a swt color instance to match the rgb values * of the specified awt color. alpha channel is not supported. * Note that the dispose method will need to be called on the * returned object. * * @param device The swt device to draw on (display or gc device). * @param color The awt color to match. * @return a swt color object. */ public static Color toSwtColor(Device device, java.awt.Color color) { return new org.eclipse.swt.graphics.Color(device, color.getRed(), color.getGreen(), color.getBlue()); } /** * Transform an awt Rectangle2d instance into a swt one. * The coordinates are rounded to integer for the swt object. * @param rect2d The awt rectangle to map. * @return an swtRectangle
object. */ public static Rectangle toSwtRectangle(Rectangle2D rect2d) { return new Rectangle( (int) Math.round(rect2d.getMinX()), (int) Math.round(rect2d.getMinY()), (int) Math.round(rect2d.getWidth()), (int) Math.round(rect2d.getHeight())); } /** * Transform a swt Rectangle instance into an awt one. * @param rect the swtRectangle
* @return a Rectangle2D.Double instance with * the eappropriate location and size. */ public static Rectangle2D toAwtRectangle(Rectangle rect) { Rectangle2D rect2d = new Rectangle2D.Double(); rect2d.setRect(rect.x, rect.y, rect.width, rect.height); return rect2d; } /** * Returns an AWT point with the same coordinates as the specified * SWT point. * * @param p the SWT point (null
not permitted). * * @return An AWT point with the same coordinates asp
. * * @see #toSwtPoint(java.awt.Point) */ public static Point2D toAwtPoint(Point p) { return new java.awt.Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified * AWT point. * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.Point p) { return new Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified AWT * point (rounded to integer values). * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.geom.Point2D p) { return new Point((int) Math.round(p.getX()), (int) Math.round(p.getY())); }
}</source>
17. Returns an SWT point with the same coordinates as the specified AWT point.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/** * Creates a swt color instance to match the rgb values * of the specified awt color. alpha channel is not supported. * Note that the dispose method will need to be called on the * returned object. * * @param device The swt device to draw on (display or gc device). * @param color The awt color to match. * @return a swt color object. */ public static Color toSwtColor(Device device, java.awt.Color color) { return new org.eclipse.swt.graphics.Color(device, color.getRed(), color.getGreen(), color.getBlue()); } /** * Transform an awt Rectangle2d instance into a swt one. * The coordinates are rounded to integer for the swt object. * @param rect2d The awt rectangle to map. * @return an swtRectangle
object. */ public static Rectangle toSwtRectangle(Rectangle2D rect2d) { return new Rectangle( (int) Math.round(rect2d.getMinX()), (int) Math.round(rect2d.getMinY()), (int) Math.round(rect2d.getWidth()), (int) Math.round(rect2d.getHeight())); } /** * Transform a swt Rectangle instance into an awt one. * @param rect the swtRectangle
* @return a Rectangle2D.Double instance with * the eappropriate location and size. */ public static Rectangle2D toAwtRectangle(Rectangle rect) { Rectangle2D rect2d = new Rectangle2D.Double(); rect2d.setRect(rect.x, rect.y, rect.width, rect.height); return rect2d; } /** * Returns an AWT point with the same coordinates as the specified * SWT point. * * @param p the SWT point (null
not permitted). * * @return An AWT point with the same coordinates asp
. * * @see #toSwtPoint(java.awt.Point) */ public static Point2D toAwtPoint(Point p) { return new java.awt.Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified * AWT point. * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.Point p) { return new Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified AWT * point (rounded to integer values). * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.geom.Point2D p) { return new Point((int) Math.round(p.getX()), (int) Math.round(p.getY())); }
}</source>
17. Returns an SWT point with the same coordinates as the specified AWT point (rounded to integer values).
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/** * Creates a swt color instance to match the rgb values * of the specified awt color. alpha channel is not supported. * Note that the dispose method will need to be called on the * returned object. * * @param device The swt device to draw on (display or gc device). * @param color The awt color to match. * @return a swt color object. */ public static Color toSwtColor(Device device, java.awt.Color color) { return new org.eclipse.swt.graphics.Color(device, color.getRed(), color.getGreen(), color.getBlue()); } /** * Transform an awt Rectangle2d instance into a swt one. * The coordinates are rounded to integer for the swt object. * @param rect2d The awt rectangle to map. * @return an swtRectangle
object. */ public static Rectangle toSwtRectangle(Rectangle2D rect2d) { return new Rectangle( (int) Math.round(rect2d.getMinX()), (int) Math.round(rect2d.getMinY()), (int) Math.round(rect2d.getWidth()), (int) Math.round(rect2d.getHeight())); } /** * Transform a swt Rectangle instance into an awt one. * @param rect the swtRectangle
* @return a Rectangle2D.Double instance with * the eappropriate location and size. */ public static Rectangle2D toAwtRectangle(Rectangle rect) { Rectangle2D rect2d = new Rectangle2D.Double(); rect2d.setRect(rect.x, rect.y, rect.width, rect.height); return rect2d; } /** * Returns an AWT point with the same coordinates as the specified * SWT point. * * @param p the SWT point (null
not permitted). * * @return An AWT point with the same coordinates asp
. * * @see #toSwtPoint(java.awt.Point) */ public static Point2D toAwtPoint(Point p) { return new java.awt.Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified * AWT point. * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.Point p) { return new Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified AWT * point (rounded to integer values). * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.geom.Point2D p) { return new Point((int) Math.round(p.getX()), (int) Math.round(p.getY())); }
}</source>
17. Transform an awt Rectangle2d instance into a swt Rectangle2d.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/** * Creates a swt color instance to match the rgb values * of the specified awt color. alpha channel is not supported. * Note that the dispose method will need to be called on the * returned object. * * @param device The swt device to draw on (display or gc device). * @param color The awt color to match. * @return a swt color object. */ public static Color toSwtColor(Device device, java.awt.Color color) { return new org.eclipse.swt.graphics.Color(device, color.getRed(), color.getGreen(), color.getBlue()); } /** * Transform an awt Rectangle2d instance into a swt one. * The coordinates are rounded to integer for the swt object. * @param rect2d The awt rectangle to map. * @return an swtRectangle
object. */ public static Rectangle toSwtRectangle(Rectangle2D rect2d) { return new Rectangle( (int) Math.round(rect2d.getMinX()), (int) Math.round(rect2d.getMinY()), (int) Math.round(rect2d.getWidth()), (int) Math.round(rect2d.getHeight())); } /** * Transform a swt Rectangle instance into an awt one. * @param rect the swtRectangle
* @return a Rectangle2D.Double instance with * the eappropriate location and size. */ public static Rectangle2D toAwtRectangle(Rectangle rect) { Rectangle2D rect2d = new Rectangle2D.Double(); rect2d.setRect(rect.x, rect.y, rect.width, rect.height); return rect2d; } /** * Returns an AWT point with the same coordinates as the specified * SWT point. * * @param p the SWT point (null
not permitted). * * @return An AWT point with the same coordinates asp
. * * @see #toSwtPoint(java.awt.Point) */ public static Point2D toAwtPoint(Point p) { return new java.awt.Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified * AWT point. * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.Point p) { return new Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified AWT * point (rounded to integer values). * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.geom.Point2D p) { return new Point((int) Math.round(p.getX()), (int) Math.round(p.getY())); }
}</source>
17. Transform a swt Rectangle instance into an AWT Rectangle.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------- * SWTUtils.java * ------------- * (C) Copyright 2006, 2007, by Henry Proudhon and Contributors. * * Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr); * Contributor(s): Rainer Blessing; * David Gilbert (david.gilbert@object-refinery.ru); * Christoph Beck. * * Changes * ------- * 01-Aug-2006 : New class (HP); * 16-Jan-2007 : Use FontData.getHeight() instead of direct field access (RB); * 31-Jan-2007 : Moved the dummy JPanel from SWTGraphics2D.java, * added a new convert method for mouse events (HP); * 12-Jul-2007 : Improved the mouse event conversion with buttons * and modifiers handling, patch sent by Christoph Beck (HP); * 27-Aug-2007 : Modified toAwtMouseEvent signature (HP); * 27-Nov-2007 : Moved convertToSWT() method from SWTGraphics2D and added * convertAWTImageToSWT() (DG); * 01-Jul-2008 : Simplify AWT/SWT font style conversions (HP); * */
import java.awt.Graphics; import java.awt.Image; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import javax.swing.JPanel; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; /**
* Utility class gathering some useful and general method. * Mainly convert forth and back graphical stuff between * awt and swt. */
public class SWTUtils {
private final static String Az = "ABCpqr"; /** A dummy JPanel used to provide font metrics. */ protected static final JPanel DUMMY_PANEL = new JPanel();
/** * Creates a swt color instance to match the rgb values * of the specified awt color. alpha channel is not supported. * Note that the dispose method will need to be called on the * returned object. * * @param device The swt device to draw on (display or gc device). * @param color The awt color to match. * @return a swt color object. */ public static Color toSwtColor(Device device, java.awt.Color color) { return new org.eclipse.swt.graphics.Color(device, color.getRed(), color.getGreen(), color.getBlue()); } /** * Transform an awt Rectangle2d instance into a swt one. * The coordinates are rounded to integer for the swt object. * @param rect2d The awt rectangle to map. * @return an swtRectangle
object. */ public static Rectangle toSwtRectangle(Rectangle2D rect2d) { return new Rectangle( (int) Math.round(rect2d.getMinX()), (int) Math.round(rect2d.getMinY()), (int) Math.round(rect2d.getWidth()), (int) Math.round(rect2d.getHeight())); } /** * Transform a swt Rectangle instance into an awt one. * @param rect the swtRectangle
* @return a Rectangle2D.Double instance with * the eappropriate location and size. */ public static Rectangle2D toAwtRectangle(Rectangle rect) { Rectangle2D rect2d = new Rectangle2D.Double(); rect2d.setRect(rect.x, rect.y, rect.width, rect.height); return rect2d; } /** * Returns an AWT point with the same coordinates as the specified * SWT point. * * @param p the SWT point (null
not permitted). * * @return An AWT point with the same coordinates asp
. * * @see #toSwtPoint(java.awt.Point) */ public static Point2D toAwtPoint(Point p) { return new java.awt.Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified * AWT point. * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.Point p) { return new Point(p.x, p.y); } /** * Returns an SWT point with the same coordinates as the specified AWT * point (rounded to integer values). * * @param p the AWT point (null
not permitted). * * @return An SWT point with the same coordinates asp
. * * @see #toAwtPoint(Point) */ public static Point toSwtPoint(java.awt.geom.Point2D p) { return new Point((int) Math.round(p.getX()), (int) Math.round(p.getY())); }
}</source>
17. Using AWT to paint inside SWT
<source lang="java">
import java.awt.Canvas; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import org.eclipse.swt.SWT; import org.eclipse.swt.awt.SWT_AWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.ruposite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class PaintAWTInsideSWT {
public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Composite composite = new Composite(shell, SWT.EMBEDDED); Frame frame = SWT_AWT.new_Frame(composite); Canvas canvas = new Canvas() { public void paint(Graphics g) { Dimension d = getSize(); g.drawLine(0, 0, d.width, d.height); } }; frame.add(canvas); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>