/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2015 Aaron Madlon-Kay Home page: http://www.omegat.org/ Support center: http://groups.yahoo.com/group/OmegaT/ This file is part of OmegaT. OmegaT 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 3 of the License, or (at your option) any later version. OmegaT 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 this program. If not, see <http://www.gnu.org/licenses/>. **************************************************************************/ package org.omegat.gui.main; import java.awt.AWTError; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.font.GlyphVector; import java.util.Map; import javax.swing.Icon; /** * @author Aaron Madlon-Kay */ public class MainMenuIcons { @SuppressWarnings({"rawtypes", "unchecked"}) abstract private static class BaseIcon implements Icon { private Map defaultHints; private Map originalHints; public BaseIcon() { originalHints = new RenderingHints(null); try { defaultHints = (Map) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints"); } catch(AWTError ignore) { } finally { if (defaultHints == null) { defaultHints = new RenderingHints(null); } } } @Override public void paintIcon(Component c, Graphics g, int x, int y) { Graphics2D g2 = (Graphics2D) g; getRenderingHints(g2, defaultHints, originalHints); g2.addRenderingHints(defaultHints); doPaint(g2, x, y); g2.addRenderingHints(originalHints); } abstract void doPaint(Graphics2D g2, int x, int y); @Override public int getIconWidth() { return ICON_SIZE; } @Override public int getIconHeight() { return ICON_SIZE; } /** * Get rendering hints from a Graphics instance. * "hintsToSave" is a Map of RenderingHint key-values. * For each hint key present in that map, the value of that * hint is obtained from the Graphics and stored as the value * for the key in savedHints. * * From: http://docs.oracle.com/javase/7/docs/api/java/awt/doc-files/DesktopProperties.html */ private Map getRenderingHints(Graphics2D g2d, Map hintsToSave, Map savedHints) { if (savedHints == null) { savedHints = new RenderingHints(null); } else { savedHints.clear(); } if (hintsToSave.isEmpty()) { return savedHints; } /* RenderingHints.keySet() returns Set */ for (Object o : hintsToSave.keySet()) { RenderingHints.Key key = (RenderingHints.Key) o; Object value = g2d.getRenderingHint(key); savedHints.put(key, value); } return savedHints; } } /** * Size of icons (both height and width) of menu entries. */ private static final int ICON_SIZE = 12; /** * Creates an empty icon of the default size. */ static Icon newBlankIcon() { return new Icon() { @Override public void paintIcon(Component c, Graphics g, int x, int y) { } @Override public int getIconWidth() { return ICON_SIZE; } @Override public int getIconHeight() { return ICON_SIZE; } }; } /** * Creates an icon to show color of background marking * @param color background color * @return */ static Icon newColorIcon(final Color color) { return new BaseIcon() { @Override void doPaint(Graphics2D g2, int x, int y) { if (color != null) { g2.setColor(color); } g2.fillRect(x, y, ICON_SIZE, ICON_SIZE); } }; } /** * Creates icon with a char in the specified color and font. * Convenience method for {@link #newTextIcon(Color, Font, char)} * that uses the default font. * @param color color of font * @param text char to draw */ static Icon newTextIcon(final Color color, final char c) { return newTextIcon(color, null, c); } /** * Creates icon with a char in the specified color and font * @param color color of font * @param font font to use * @param text char to draw */ static Icon newTextIcon(final Color color, final Font font, final char c) { final char[] chars = new char[] {c}; return new BaseIcon() { @Override void doPaint(Graphics2D g2, int x, int y) { if (color != null) { g2.setColor(color); } Font originalFont = g2.getFont(); if (font != null) { g2.setFont(font); } GlyphVector gv = g2.getFont().layoutGlyphVector(g2.getFontRenderContext(), chars, 0, 1, Font.LAYOUT_LEFT_TO_RIGHT); Rectangle r = gv.getPixelBounds(g2.getFontRenderContext(), 0, 0); int dx = x + r.x + (ICON_SIZE - r.width) / 2; int dy = y + ICON_SIZE - (r.y + r.height) - (ICON_SIZE - r.height) / 2; g2.drawGlyphVector(gv, dx, dy); g2.setFont(originalFont); } }; } }