/* * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. * */ package sun.jvm.hotspot.ui; import java.awt.*; import java.awt.font.*; import java.awt.geom.*; import java.util.Random; import javax.swing.*; import javax.swing.border.*; /** Useful utilities for drawing graphics */ public class GraphicsUtilities { /** Returns a plain-styled 12-point version of the given font, or null if the font could not be found */ public static Font lookupFont(String fontName) { Font[] allFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); Font font = null; for (int i = 0; i < allFonts.length; i++) { if (allFonts[i].getFontName().indexOf(fontName) != -1) { font = allFonts[i]; break; } } if (font == null) { return null; } return font.deriveFont(Font.PLAIN, 12); } /** Compute the width and height of given string given the current font context in the Graphics object */ public static Rectangle2D getStringBounds(String s, Graphics g) { FontMetrics fm = g.getFontMetrics(); return fm.getStringBounds(s, 0, s.length(), g); } /** Compute just the width of the given string with the given FontMetrics. This is less accurate then getStringBounds(), above, since the graphics context is not taken into account. */ public static int getStringWidth(String s, FontMetrics fm) { return fm.stringWidth(s); } public static void reshapeToAspectRatio(Component component, float aspectRatio, float fillRatio, Dimension containerDimension) { int x = containerDimension.width; int y = containerDimension.height; int desiredX; int desiredY; if (((float) x / (float) y) > aspectRatio) { desiredY = (int) (fillRatio * y); desiredX = (int) (desiredY * aspectRatio); } else { desiredX = (int) (fillRatio * x); desiredY = (int) (desiredX / aspectRatio); } component.setSize(desiredX, desiredY); } public static void constrainToSize(Component component, Dimension containerDimension) { Dimension d = component.getSize(); int x = d.width; int y = d.height; boolean changed = false; if (x > containerDimension.width) { x = containerDimension.width; changed = true; } if (y > containerDimension.height) { y = containerDimension.height; changed = true; } if (changed) { component.setSize(x, y); } } public static void centerInContainer(Component c) { centerInContainer(c, c.getParent().getSize()); } public static void centerInContainer(Component component, Dimension containerDimension) { Dimension sz = component.getSize(); int x = ((containerDimension.width - sz.width) / 2); int y = ((containerDimension.height - sz.height) / 2); component.setLocation(x, y); } public static void moveToInContainer(Component component, float relativeX, float relativeY, int minX, int minY) { Dimension d = component.getParent().getSize(); // Move the center of this component to the relative position in // the parent. Don't clip this component, however. Dimension sz = component.getSize(); int xPos = Math.min(d.width - sz.width, (int) ((d.width * relativeX) - (sz.width / 2))); int yPos = Math.min(d.height - sz.height, (int) ((d.height * relativeY) - (sz.height / 2))); xPos = Math.max(xPos, minX); yPos = Math.max(yPos, minY); component.setLocation(xPos, yPos); } static Random random = new Random(); public static void randomLocation(Component c) { randomLocation(c, c.getParent().getSize()); } public static void randomLocation(Component component, Dimension containerDimension) { Dimension sz = component.getSize(); int x = (int)((containerDimension.width - sz.width) * random.nextFloat()); int y = (int)((containerDimension.height - sz.height) * random.nextFloat()); component.setLocation(x, y); } public static Border newBorder(int size) { return BorderFactory.createEmptyBorder(size, size, size, size); } }