Mega Code Archive

 
Categories / Java / SWT Jface Eclipse
 

Create an awt font by converting as much information as possible from the provided swt FontData

/*   * 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.com);  *                   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 <code>FontData</code> 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 a <code>FontData</code> 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 <code>FontData</code>.      * <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);     } }