components/visual-panels/core/src/java/util/com/oracle/solaris/vp/util/misc/IconUtil.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/components/visual-panels/core/src/java/util/com/oracle/solaris/vp/util/misc/IconUtil.java Thu May 24 04:16:47 2012 -0400
@@ -0,0 +1,163 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
+ */
+
+package com.oracle.solaris.vp.util.misc;
+
+import java.awt.*;
+import java.util.*;
+import java.util.List;
+import javax.swing.*;
+import com.oracle.solaris.vp.util.swing.*;
+
+public class IconUtil {
+ //
+ // Static methods
+ //
+
+ /**
+ * Creates, from the given icon, a new icon with the given height. If the
+ * given height is greater than the height of the given icon, the icon will
+ * be padded. If the given height is less than the height of the given
+ * icon, the icon will be shrunk.
+ *
+ * @param icon
+ * the icon to crop or pad
+ *
+ * @param height
+ * a height to apply to the given icon, or -1 if no change
+ * should be made to this icon's height
+ *
+ * @return a new {@code Icon}
+ */
+ public static Icon ensureIconHeight(Icon icon, int height) {
+ if (icon != null) {
+ int iWidth = icon.getIconWidth();
+ int iHeight = icon.getIconHeight();
+
+ if (iHeight > height) {
+ // Maintain aspect ratio
+ icon = new ScaledIcon(
+ icon, (iWidth * height) / iHeight, height);
+ } else if (iHeight < height) {
+ icon = new CroppedPaddedIcon(icon, iWidth, height);
+ }
+ }
+
+ return icon;
+ }
+
+ public static Icon getBadgedIcon(Icon icon, Icon badge) {
+ int sHeight = badge.getIconHeight();
+ int sWidth = badge.getIconWidth();
+
+ return getBadgedIcon(icon, badge, sWidth / 2, sHeight / 2);
+ }
+
+ public static Icon getBadgedIcon(final Icon icon, final Icon badge,
+ int xOffset, int yOffset) {
+
+ // Calculate once
+ final int sHeight = badge.getIconHeight();
+ final int sWidth = badge.getIconWidth();
+ final int height = icon.getIconHeight() + yOffset;
+ final int width = icon.getIconWidth() + xOffset;
+
+ return new Icon() {
+ public int getIconHeight() {
+ return height;
+ }
+
+ public int getIconWidth() {
+ return width;
+ }
+
+ public void paintIcon(Component c, Graphics g, int x, int y) {
+ icon.paintIcon(c, g, x, y);
+ badge.paintIcon(c, g, x + width - sWidth, y + height - sHeight);
+ }
+ };
+ }
+
+ /**
+ * From the given icons, chooses the icon taller than (if available) and
+ * closest to the given height.
+ *
+ * @param icons
+ * the icons to choose from
+ *
+ * @param height
+ * the desired height of the icon
+ */
+ public static <I extends Icon> I getClosestIcon(Collection<I> icons,
+ int height) {
+
+ I icon = null;
+
+ if (icons != null) {
+ int diff = 0;
+
+ for (I i : icons) {
+ int d = i.getIconHeight() - height;
+ if (d == 0) {
+ return i;
+ }
+
+ if (icon == null ||
+ (diff < 0 && d > diff) ||
+ (diff > 0 && d < diff && d >= 0)) {
+
+ icon = i;
+ diff = d;
+ }
+ }
+ }
+
+ return icon;
+ }
+
+ /**
+ * Converts the given {@code Icon}s to {@code Image}s.
+ *
+ * @param icons
+ * a {@code List} of {@code Icon}s
+ *
+ * @return a (possibly empty) {@code List} of {@code Image}s, or {@code
+ * null} if {@code icons} is {@code null}
+ */
+ public static List<Image> toImages(List<? extends Icon> icons) {
+ // This simple implementation only works with ImageIcons
+ List<Image> images = null;
+ if (icons != null) {
+ images = new ArrayList<Image>(icons.size());
+ for (Icon icon : icons) {
+ if (icon instanceof ImageIcon) {
+ Image image = ((ImageIcon)icon).getImage();
+ images.add(image);
+ }
+ }
+ }
+ return images;
+ }
+}