changeset 1206:804a5aa7d565

Add FontAwesomeIcon to Thermostat review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-July/007621.html reviewed-by: omajid
author Mario Torre <neugens.limasoftware@gmail.com>
date Mon, 05 Aug 2013 11:56:18 +0200
parents 0a9cebd0ebd7
children 27c09390b3ce
files client/swing/pom.xml client/swing/src/main/java/com/redhat/thermostat/client/swing/components/FontAwesomeIcon.java client/swing/src/main/resources/fontawesome-webfont.ttf client/swing/src/test/java/com/redhat/thermostat/client/swing/components/FontAwesomeIconTest.java
diffstat 4 files changed, 211 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/client/swing/pom.xml	Mon Aug 05 11:56:13 2013 +0200
+++ b/client/swing/pom.xml	Mon Aug 05 11:56:18 2013 +0200
@@ -139,6 +139,7 @@
         <filtering>true</filtering>
         <excludes>
           <exclude>**/*.png</exclude>
+          <exclude>**/*.ttf</exclude>
         </excludes>
       </resource>
       <resource>
@@ -146,6 +147,7 @@
         <filtering>false</filtering>
         <includes>
           <include>**/*.png</include>
+          <include>**/*.ttf</include>
         </includes>
       </resource>
     </resources>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/FontAwesomeIcon.java	Mon Aug 05 11:56:18 2013 +0200
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.client.swing.components;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.awt.FontFormatException;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Creates an {@link Icon} from a given FontAwesome unicode identifier.
+ * 
+ * @see http://fortawesome.github.io/Font-Awesome/cheatsheet/
+ */
+@SuppressWarnings("serial")
+public class FontAwesomeIcon extends Icon {
+
+    private static final String AWESOME_SET = "fontawesome-webfont.ttf";
+    
+    private int size;
+    private BufferedImage buffer;
+    
+    private char iconID;
+    private static final Font awesome;
+    
+    private Font font;
+    
+    static {
+        try {
+            InputStream stream =
+                    FontAwesomeIcon.class.getClassLoader().getResourceAsStream(AWESOME_SET);
+            awesome = Font.createFont(Font.TRUETYPE_FONT, stream);
+
+        } catch (FontFormatException | IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+    
+    /**
+     * Please, refer to:
+     * <a href='http://fortawesome.github.io/Font-Awesome/cheatsheet/'>
+     * Font-Awesome Website</a> for the actual
+     * values accepted as {@code iconID}.
+     * 
+     * @see {@link http://fortawesome.github.io/Font-Awesome/cheatsheet/}
+     */
+    public FontAwesomeIcon(char iconID, int size) {
+        this.iconID = iconID;
+        this.size = size;
+        font = awesome.deriveFont(Font.PLAIN, size);
+    }
+
+    @Override
+    public synchronized void paintIcon(Component c, Graphics g, int x, int y) {
+        
+        if (buffer == null) {
+            buffer = new BufferedImage(getIconWidth(), getIconHeight(),
+                                       BufferedImage.TYPE_INT_ARGB);
+            
+            Graphics2D graphics = (Graphics2D) buffer.getGraphics();
+            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                                      RenderingHints.VALUE_ANTIALIAS_ON);
+            
+            graphics.setFont(font);
+            graphics.setColor(Color.BLACK);
+            
+            int stringY = getIconHeight() - (getIconHeight()/4) + 1;
+            graphics.drawString(String.valueOf(iconID), 0, stringY);
+            
+            graphics.dispose();
+        }
+        
+        g.drawImage(buffer, x, y, null);
+    }
+
+    @Override
+    public int getIconHeight() {
+        return size;
+    }
+
+    @Override
+    public int getIconWidth() {
+        return size;
+    }
+}
Binary file client/swing/src/main/resources/fontawesome-webfont.ttf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/FontAwesomeIconTest.java	Mon Aug 05 11:56:18 2013 +0200
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.client.swing.components;
+
+import static org.junit.Assert.*;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+
+import org.junit.Test;
+
+public class FontAwesomeIconTest {
+
+    @Test
+    public void testIcon() {
+        FontAwesomeIcon icon = new FontAwesomeIcon('\uf004', 24);
+        
+        assertEquals(24, icon.getIconHeight());
+        assertEquals(24, icon.getIconWidth());
+        
+        BufferedImage buffer = new BufferedImage(24, 24, BufferedImage.TYPE_INT_ARGB);
+        Graphics g = buffer.getGraphics();
+        
+        g.setColor(Color.WHITE);
+        g.fillRect(0, 0, 24, 24);
+        
+        icon.paintIcon(null, g, 0, 0);
+        
+        g.dispose();
+        
+        int rgb = buffer.getRGB(0, 0);
+        
+        assertEquals(0xFFFFFFFF, rgb);
+        
+        rgb = buffer.getRGB(12, 8);
+        assertEquals(0xFF000000, rgb);
+        
+        rgb = buffer.getRGB(12, 12);
+        assertEquals(0xFF000000, rgb);
+        
+        rgb = buffer.getRGB(12, 21);
+        assertEquals(0xFFFFFFFF, rgb);
+        
+        rgb = buffer.getRGB(12, 20);
+        assertFalse(0xFFFFFFFF == rgb);
+        assertFalse(0xFF000000 == rgb);
+    }
+
+}