// ********************************************************************** // // <copyright> // // BBN Technologies // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** // // $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/gui/dock/TransparentButtonUI.java,v $ // $RCSfile: TransparentButtonUI.java,v $ // $Revision: 1.4 $ // $Date: 2005/08/09 17:50:51 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.gui.dock; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.AbstractButton; import javax.swing.BorderFactory; import javax.swing.ButtonModel; import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.metal.MetalButtonUI; /** * A subclass of the metal UI that draws a semi-transparent button on * top of other components. * * @author Ben Lubin * @version $Revision: 1.4 $ on $Date: 2005/08/09 17:50:51 $ * @since 12/5/02 */ public class TransparentButtonUI extends MetalButtonUI { private final static TransparentButtonUI transButtonUI = new TransparentButtonUI(); private static final int VshadowSize = 4; private static final int HshadowSize = 2; private static final int VpressOffset = 3; private static final int HpressOffset = 1; // ******************************** // Create PLAF // ******************************** public static ComponentUI createUI(JComponent c) { return transButtonUI; } public void installDefaults(AbstractButton b) { super.installDefaults(b); b.setBorder(BorderFactory.createEmptyBorder(0, 0, VshadowSize, HshadowSize)); b.setFocusPainted(false); } public Color getBGColor(AbstractButton c) { Color bg = c.getBackground(); return new Color(bg.getRed(), bg.getGreen(), bg.getBlue(), 200); } public Color getSelectedBGColor(AbstractButton c) { // Color bg = c.getBackground(); return new Color(225, 225, 125, 200); } Color darkShadow = new Color(0, 0, 0, 200); public Color getDarkShadow() { return darkShadow; } Color mediumShadow = new Color(0, 0, 0, 125); public Color getMediumShadow() { return mediumShadow; } Color lightShadow = new Color(0, 0, 0, 50); public Color getLightShadow() { return lightShadow; } // ******************************** // Paint Methods // ******************************** public void paint(Graphics g, JComponent c) { AbstractButton b = (AbstractButton) c; ButtonModel model = b.getModel(); Dimension size = b.getSize(); // perform UI specific press action, e.g. Windows L&F shifts // text if (model.isArmed() && model.isPressed() || model.isSelected()) { //We're pressed: g = g.create(HpressOffset, VpressOffset, size.width, size.height); Dimension sSize = new Dimension(size.width - HpressOffset, size.height - VpressOffset); drawShadow(g, sSize, VshadowSize - VpressOffset, HshadowSize - HpressOffset); } else { //We're not pressed: drawShadow(g, size, VshadowSize, HshadowSize); } //Paint a background: if (model.isArmed() && model.isPressed() || model.isSelected()) { //Selected color: g.setColor(getSelectedBGColor(b)); } else { //Button's color g.setColor(getBGColor(b)); } g.fillRect(0, 0, size.width - HshadowSize, size.height - VshadowSize); super.paint(g, c); } private void drawShadow(Graphics g, Dimension size, int vShadowSize, int hShadowSize) { drawHArea(g, size, getDarkShadow(), vShadowSize, hShadowSize, 0, vShadowSize / 3); drawHArea(g, size, getMediumShadow(), vShadowSize, hShadowSize, vShadowSize / 3, vShadowSize * 2 / 3); drawHArea(g, size, getLightShadow(), vShadowSize, hShadowSize, vShadowSize * 2 / 3, vShadowSize); int last = 0; int next = hShadowSize / 3; if (hShadowSize % 3 == 2) { next += 1; } drawVArea(g, size, getDarkShadow(), vShadowSize, hShadowSize, last, next); last = next; if (hShadowSize * 2 / 3 > last) { next = hShadowSize * 2 / 3; drawVArea(g, size, getMediumShadow(), vShadowSize, hShadowSize, last, next); } last = next; if (hShadowSize > last) { next = hShadowSize; drawVArea(g, size, getLightShadow(), vShadowSize, hShadowSize, last, next); } } private void drawHArea(Graphics g, Dimension size, Color c, int vShadowSize, int hShadowSize, int low, int high) { g.setColor(c); for (int i = low; i < high; i++) { drawHLine(g, size, vShadowSize, hShadowSize, i); } } private void drawHLine(Graphics g, Dimension size, int vShadowSize, int hShadowSize, int i) { g.drawLine(i * hShadowSize / vShadowSize, size.height - vShadowSize + i, size.width - hShadowSize + (i * hShadowSize / vShadowSize), size.height - vShadowSize + i); } private void drawVArea(Graphics g, Dimension size, Color c, int vShadowSize, int hShadowSize, int low, int high) { g.setColor(c); for (int i = low; i < high; i++) { drawVLine(g, size, vShadowSize, hShadowSize, i); } } private void drawVLine(Graphics g, Dimension size, int vShadowSize, int hShadowSize, int i) { g.drawLine(size.width - hShadowSize + i, (i * vShadowSize / hShadowSize), size.width - hShadowSize + i, size.height - vShadowSize + (i * vShadowSize / hShadowSize) - 1); } /** From super class. Don't want to do metal's behavior... */ protected void paintButtonPressed(Graphics g, AbstractButton b) {} }