/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.ui.components.gradientslider; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Shape; import javax.swing.SwingConstants; import javax.swing.UIManager; // Author Jeremy Wood public class PaintUtils { /** Four shades of white, each with increasing opacity. */ public final static Color[] whites = new Color[]{ new Color(255, 255, 255, 50), new Color(255, 255, 255, 100), new Color(255, 255, 255, 150) }; /** Four shades of black, each with increasing opacity. */ public final static Color[] blacks = new Color[]{ new Color(0, 0, 0, 50), new Color(0, 0, 0, 100), new Color(0, 0, 0, 150) }; /** @return the color used to indicate when a component has * focus. By default this uses the color (64,113,167), but you can * override this by calling: * <BR><code>UIManager.put("focusRing",customColor);</code> */ public static Color getFocusRingColor() { Object obj = UIManager.getColor("focusRing"); if (obj instanceof Color) { return (Color) obj; } return new Color(64, 113, 167); } /** Paints 3 different strokes around a shape to indicate focus. * The widest stroke is the most transparent, so this achieves a nice * "glow" effect. * <P>The catch is that you have to render this underneath the shape, * and the shape should be filled completely. * * @param g the graphics to paint to * @param shape the shape to outline * @param biggestStroke the widest stroke to use. */ public static void paintFocus(Graphics2D g, Shape shape, int biggestStroke) { Color focusColor = getFocusRingColor(); Color[] focusArray = new Color[]{ new Color(focusColor.getRed(), focusColor.getGreen(), focusColor.getBlue(), 255), new Color(focusColor.getRed(), focusColor.getGreen(), focusColor.getBlue(), 170), new Color(focusColor.getRed(), focusColor.getGreen(), focusColor.getBlue(), 110) }; g.setStroke(new BasicStroke(biggestStroke)); g.setColor(focusArray[2]); g.draw(shape); g.setStroke(new BasicStroke(biggestStroke - 1)); g.setColor(focusArray[1]); g.draw(shape); g.setStroke(new BasicStroke(biggestStroke - 2)); g.setColor(focusArray[0]); g.draw(shape); g.setStroke(new BasicStroke(1)); } /** Uses translucent shades of white and black to draw highlights * and shadows around a rectangle, and then frames the rectangle * with a shade of gray (120). * <P>This should be called to add a finishing touch on top of * existing graphics. * @param g the graphics to paint to. * @param r the rectangle to paint. */ public static void drawBevel(Graphics g, Rectangle r) { drawColors(blacks, g, r.x, r.y + r.height, r.x + r.width, r.y + r.height, SwingConstants.SOUTH); drawColors(blacks, g, r.x + r.width, r.y, r.x + r.width, r.y + r.height, SwingConstants.EAST); drawColors(whites, g, r.x, r.y, r.x + r.width, r.y, SwingConstants.NORTH); drawColors(whites, g, r.x, r.y, r.x, r.y + r.height, SwingConstants.WEST); g.setColor(new Color(120, 120, 120)); g.drawRect(r.x, r.y, r.width, r.height); } private static void drawColors(Color[] colors, Graphics g, int x1, int y1, int x2, int y2, int direction) { for (int a = 0; a < colors.length; a++) { g.setColor(colors[colors.length - a - 1]); if (direction == SwingConstants.SOUTH) { g.drawLine(x1, y1 - a, x2, y2 - a); } else if (direction == SwingConstants.NORTH) { g.drawLine(x1, y1 + a, x2, y2 + a); } else if (direction == SwingConstants.EAST) { g.drawLine(x1 - a, y1, x2 - a, y2); } else if (direction == SwingConstants.WEST) { g.drawLine(x1 + a, y1, x2 + a, y2); } } } }