/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 ro.nextreports.designer.util;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.event.WindowListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
import javax.swing.border.LineBorder;
/**
* Created by IntelliJ IDEA.
* User: mihai.panaitescu
* Date: Sep 1, 2006
* Time: 3:50:06 PM
*/
public class Label2D extends JFrame {
public Label2D() {
super("2D Labels");
setSize(600, 250);
getContentPane().setLayout(new GridLayout(6, 1, 5, 5));
getContentPane().setBackground(Color.white);
Font bigFont = new Font("Helvetica", Font.BOLD, 24);
JLabel2D lbl = new JLabel2D("Simple JLabel2D With Outline",
JLabel.CENTER);
lbl.setFont(bigFont);
lbl.setForeground(Color.blue);
lbl.setBorder(new LineBorder(Color.black));
lbl.setBackground(Color.cyan);
lbl.setOutlineColor(Color.yellow);
lbl.setStroke(new BasicStroke(5f));
lbl.setOpaque(true);
lbl.setShearFactor(0.3);
getContentPane().add(lbl);
lbl = new JLabel2D("JLabel2D With Color Gradient", JLabel.CENTER);
lbl.setFont(bigFont);
lbl.setOutlineColor(Color.black);
lbl.setEffectIndex(JLabel2D.EFFECT_GRADIENT);
GradientPaint gp = new GradientPaint(0, 0,
Color.red, 100, 50, Color.blue, true);
lbl.setGradient(gp);
getContentPane().add(lbl);
lbl = new JLabel2D("JLabel2D Filled With Image", JLabel.CENTER);
lbl.setFont(bigFont);
lbl.setEffectIndex(JLabel2D.EFFECT_IMAGE);
ImageIcon icon = new ImageIcon("mars.gif");
lbl.setForegroundImage(icon.getImage());
lbl.setOutlineColor(Color.red);
getContentPane().add(lbl);
lbl = new JLabel2D("JLabel2D With Image Animation", JLabel.CENTER);
lbl.setFont(bigFont);
lbl.setEffectIndex(JLabel2D.EFFECT_IMAGE_ANIMATION);
icon = new ImageIcon("ocean.gif");
lbl.setForegroundImage(icon.getImage());
lbl.setOutlineColor(Color.black);
lbl.startAnimation(300);
getContentPane().add(lbl);
lbl = new JLabel2D("JLabel2D With Color Animation",
JLabel.CENTER);
lbl.setFont(bigFont);
lbl.setEffectIndex(JLabel2D.EFFECT_COLOR_ANIMATION);
gp = new GradientPaint(0, 0,
Color.black, 100, 50, Color.lightGray, true);
lbl.setGradient(gp);
lbl.setOutlineColor(Color.black);
lbl.startAnimation(150);
getContentPane().add(lbl);
JLabel lbl1 = new JLabel("Plain JLabel For Comparison", JLabel.CENTER);
lbl1.setFont(bigFont);
lbl1.setForeground(Color.black);
getContentPane().add(lbl1);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
setVisible(true);
}
public static void main(String argv[]) {
new Label2D();
}
}
class JLabel2D extends JLabel {
public static final int EFFECT_PLAIN = 0;
public static final int EFFECT_GRADIENT = 1;
public static final int EFFECT_IMAGE = 2;
public static final int EFFECT_IMAGE_ANIMATION = 3;
public static final int EFFECT_COLOR_ANIMATION = 4;
protected int m_effectIndex = EFFECT_PLAIN;
protected double m_shearFactor = 0.0;
protected Color m_outlineColor;
protected Stroke m_stroke;
protected GradientPaint m_gradient;
protected Image m_foregroundImage;
protected Thread m_animator;
protected boolean m_isRunning = false;
protected int m_delay;
protected int m_xShift;
public JLabel2D() {
super();
}
public JLabel2D(String text) {
super(text);
}
public JLabel2D(String text, int alignment) {
super(text, alignment);
}
public void setEffectIndex(int effectIndex) {
m_effectIndex = effectIndex;
repaint();
}
public int getEffectIndex() {
return m_effectIndex;
}
public void setShearFactor(double shearFactor) {
m_shearFactor = shearFactor;
repaint();
}
public double getShearFactor() {
return m_shearFactor;
}
public void setOutlineColor(Color outline) {
m_outlineColor = outline;
repaint();
}
public Color getOutlineColor() {
return m_outlineColor;
}
public void setStroke(Stroke stroke) {
m_stroke = stroke;
repaint();
}
public Stroke getStroke() {
return m_stroke;
}
public void setGradient(GradientPaint gradient) {
m_gradient = gradient;
repaint();
}
public GradientPaint getGradient() {
return m_gradient;
}
public void setForegroundImage(Image img) {
m_foregroundImage = img;
repaint();
}
public Image getForegroundImage() {
return m_foregroundImage;
}
public void startAnimation(int delay) {
if (m_animator != null)
return;
m_delay = delay;
m_xShift = 0;
m_isRunning = true;
m_animator = new Thread() {
double arg = 0;
public void run() {
while (m_isRunning) {
if (m_effectIndex == EFFECT_IMAGE_ANIMATION)
m_xShift += 10;
else if (
m_effectIndex == EFFECT_COLOR_ANIMATION &&
m_gradient != null) {
arg += Math.PI / 10;
double cos = Math.cos(arg);
double f1 = (1 + cos) / 2;
double f2 = (1 - cos) / 2;
arg = arg % (Math.PI * 2);
Color c1 = m_gradient.getColor1();
Color c2 = m_gradient.getColor2();
int r = (int) (c1.getRed() * f1 + c2.getRed() * f2);
r = Math.min(Math.max(r, 0), 255);
int g = (int) (c1.getGreen() * f1 + c2.getGreen() * f2);
g = Math.min(Math.max(g, 0), 255);
int b = (int) (c1.getBlue() * f1 + c2.getBlue() * f2);
b = Math.min(Math.max(b, 0), 255);
setForeground(new Color(r, g, b));
}
repaint();
try {
sleep(m_delay);
}
catch (InterruptedException ex) {
break;
}
}
}
};
m_animator.start();
}
public void stopAnimation() {
m_isRunning = false;
m_animator = null;
}
public void paintComponent(Graphics g) {
Dimension d = getSize();
Insets ins = getInsets();
int x = ins.left;
int y = ins.top;
int w = d.width - ins.left - ins.right;
int h = d.height - ins.top - ins.bottom;
if (isOpaque()) {
g.setColor(getBackground());
g.fillRect(0, 0, d.width, d.height);
}
paintBorder(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
FontRenderContext frc = g2.getFontRenderContext();
TextLayout tl = new TextLayout(getText(), getFont(), frc);
AffineTransform shear = AffineTransform.
getShearInstance(m_shearFactor, 0.0);
Shape src = tl.getOutline(shear);
Rectangle rText = src.getBounds();
float xText = x - rText.x;
switch (getHorizontalAlignment()) {
case CENTER:
xText = x + (w - rText.width) / 2;
break;
case RIGHT:
xText = x + (w - rText.width);
break;
}
float yText = y + h / 2 + tl.getAscent() / 4;
AffineTransform shift = AffineTransform.
getTranslateInstance(xText, yText);
Shape shp = shift.createTransformedShape(src);
if (m_outlineColor != null) {
g2.setColor(m_outlineColor);
if (m_stroke != null)
g2.setStroke(m_stroke);
g2.draw(shp);
}
switch (m_effectIndex) {
case EFFECT_GRADIENT:
if (m_gradient == null)
break;
g2.setPaint(m_gradient);
g2.fill(shp);
break;
case EFFECT_IMAGE:
fillByImage(g2, shp, 0);
break;
case EFFECT_COLOR_ANIMATION:
g2.setColor(getForeground());
g2.fill(shp);
break;
case EFFECT_IMAGE_ANIMATION:
if (m_foregroundImage == null)
break;
int wImg = m_foregroundImage.getWidth(this);
if (m_xShift > wImg)
m_xShift = 0;
fillByImage(g2, shp, m_xShift - wImg);
break;
default:
g2.setColor(getForeground());
g2.fill(shp);
break;
}
}
protected void fillByImage(Graphics2D g2,
Shape shape, int xOffset) {
if (m_foregroundImage == null)
return;
int wImg = m_foregroundImage.getWidth(this);
int hImg = m_foregroundImage.getHeight(this);
if (wImg <= 0 || hImg <= 0)
return;
g2.setClip(shape);
Rectangle bounds = shape.getBounds();
for (int xx = bounds.x + xOffset;
xx < bounds.x + bounds.width; xx += wImg)
for (int yy = bounds.y; yy < bounds.y + bounds.height;
yy += hImg)
g2.drawImage(m_foregroundImage, xx, yy, this);
}
}