Mercurial > hg > truffle
diff agent/src/share/classes/sun/jvm/hotspot/ui/GraphicsUtilities.java @ 0:a61af66fc99e jdk7-b24
Initial load
author | duke |
---|---|
date | Sat, 01 Dec 2007 00:00:00 +0000 |
parents | |
children | c18cbe5936b8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agent/src/share/classes/sun/jvm/hotspot/ui/GraphicsUtilities.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,156 @@ +/* + * Copyright 2000-2004 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.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); + } +}