/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.sparkplugin.ui.components;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* RoundLabel
* <p/>
*
* @author Derek DeMoro
*/
public class RoundLabel extends JPanel {
private static final long serialVersionUID = 3033706476185642799L;
public static float[] BLUR = {0.10f, 0.10f, 0.10f, 0.10f, 0.30f, 0.10f, 0.10f, 0.10f, 0.10f};
private int inset = 0;
private Color buttonColor;
private String text = "Current Call";
private Color foregroundColor = Color.white;
/**
* Creates a round label
*
* @param text
* @param foreground
* @param buttonColor
*/
public RoundLabel(String text, Color foreground, Color buttonColor) {
this.buttonColor = buttonColor;
this.text = text;
this.foregroundColor = foreground;
setBorder(BorderFactory.createLineBorder(Color.white));
setOpaque(false);
}
public RoundLabel() {
// empty Constructor
setBorder(BorderFactory.createLineBorder(Color.white));
setOpaque(false);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int vWidth = getWidth();
int vHeight = getHeight();
// Calculate the size of the button
int vButtonHeight = vHeight - (inset * 2);
int vButtonWidth = vWidth - (inset * 2);
BufferedImage vBuffer = new BufferedImage(vWidth, vHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D bg = vBuffer.createGraphics();
bg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// Paint the background of the button
bg.setColor(Color.white);
bg.fillRect(0, 0, vWidth, vHeight);
// Create the gradient paint for the first layer of the button
Color vGradientStartColor = buttonColor;
Color vGradientEndColor = buttonColor;
Paint vPaint = new GradientPaint(0, inset, vGradientStartColor, 0, vButtonHeight, vGradientEndColor, false);
bg.setPaint(vPaint);
// Paint the first layer of the button
bg.fillRect(inset, inset, vButtonWidth, vButtonHeight);//, vArcSize, vArcSize);
// Calulate the size of the second layer of the button
int vHighlightInset = 2;
int vButtonHighlightHeight = vButtonHeight - (vHighlightInset * 2);
int vButtonHighlightWidth = vButtonWidth - (vHighlightInset * 2);
bg.setClip(new RoundRectangle2D.Float(inset + vHighlightInset, inset + vHighlightInset, vButtonHighlightWidth, vButtonHighlightHeight / 2, vButtonHighlightHeight / 3, vButtonHighlightHeight / 3));
// bg.fillRoundRect(inset + vHighlightInset, inset + vHighlightInset, vButtonHighlightWidth, vButtonHighlightHeight, vHighlightArcSize, vHighlightArcSize);
// Blur the button
ConvolveOp vBlurOp = new ConvolveOp(new Kernel(3, 3, BLUR));
BufferedImage vBlurredBase = vBlurOp.filter(vBuffer, null);
// Draw our aqua button
g2.drawImage(vBlurredBase, 0, 0, null);
// Draw the text (if any)
if (text != null) {
g2.setColor(foregroundColor);
Font vFont = g2.getFont().deriveFont((float)(((float)vButtonHeight) * .6));
g2.setFont(vFont);
FontMetrics vMetrics = g2.getFontMetrics();
Rectangle2D vStringBounds = vMetrics.getStringBounds(text, g2);
float x = (float)((vWidth / 2) - (vStringBounds.getWidth() / 2));
float y = (float)((vHeight / 2) + (vStringBounds.getHeight() / 2)) - vMetrics.getDescent();
g2.drawString(text, x, y);
}
}
// --------------------------------------------------------------------------
// Utility Methods
// --------------------------------------------------------------------------
/**
* A main method to test the panel.
*
* @param args
*/
public static void main(String[] args) {
JFrame vFrame = new JFrame(RoundLabel.class.getName());
vFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
vFrame.setSize(300, 100);
vFrame.setLayout(new GridBagLayout());
RoundLabel label = new RoundLabel("Hello", Color.white, new Color(198, 211, 247));
vFrame.add(label, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 10));
vFrame.setTitle("Aqua Button");
vFrame.setVisible(true);
}
}