138 lines
3.8 KiB
Java
138 lines
3.8 KiB
Java
|
|
package net.sourceforge.tuned.ui;
|
|
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Component;
|
|
import java.awt.Graphics;
|
|
import java.awt.Graphics2D;
|
|
import java.awt.Insets;
|
|
import java.awt.RadialGradientPaint;
|
|
import java.awt.geom.Point2D;
|
|
import java.awt.geom.Rectangle2D;
|
|
import java.awt.geom.RectangularShape;
|
|
|
|
import javax.swing.border.AbstractBorder;
|
|
|
|
|
|
public class ShadowBorder extends AbstractBorder {
|
|
|
|
private int smoothness;
|
|
|
|
private int smoothnessOffset;
|
|
|
|
private int offset;
|
|
|
|
|
|
public ShadowBorder() {
|
|
this(2, 2, 12);
|
|
}
|
|
|
|
|
|
public ShadowBorder(int offset, int smoothness, int smoothnessOffset) {
|
|
this.offset = offset;
|
|
this.smoothness = smoothness;
|
|
this.smoothnessOffset = smoothnessOffset;
|
|
}
|
|
|
|
|
|
@Override
|
|
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
|
|
Graphics2D g2d = (Graphics2D) g;
|
|
|
|
Color bg = new Color(0, 0, 0, 81);
|
|
Color faded = new Color(0, 0, 0, 0);
|
|
|
|
int a = smoothness + smoothnessOffset;
|
|
|
|
Rectangle2D main = new Rectangle2D.Double(a, a, width - a * 2, height - a * 2);
|
|
|
|
g2d.setPaint(bg);
|
|
g2d.fill(main);
|
|
|
|
Rectangle2D right = new Rectangle2D.Double(main.getMaxX(), a, a, main.getHeight());
|
|
Rectangle2D left = new Rectangle2D.Double(0, a, a, main.getHeight());
|
|
Rectangle2D top = new Rectangle2D.Double(a, 0, main.getWidth(), a);
|
|
Rectangle2D bottom = new Rectangle2D.Double(a, main.getMaxY(), main.getWidth(), a);
|
|
|
|
g2d.setPaint(GradientStyle.LEFT_TO_RIGHT.getGradientPaint(right, bg, faded));
|
|
g2d.fill(right);
|
|
|
|
g2d.setPaint(GradientStyle.RIGHT_TO_LEFT.getGradientPaint(left, bg, faded));
|
|
g2d.fill(left);
|
|
|
|
g2d.setPaint(GradientStyle.BOTTOM_TO_TOP.getGradientPaint(top, bg, faded));
|
|
g2d.fill(top);
|
|
|
|
g2d.setPaint(GradientStyle.TOP_TO_BOTTOM.getGradientPaint(bottom, bg, faded));
|
|
g2d.fill(bottom);
|
|
|
|
Rectangle2D topLeftCorner = new Rectangle2D.Double(0, 0, a, a);
|
|
Rectangle2D topRightCorner = new Rectangle2D.Double(width - a, 0, a, a);
|
|
Rectangle2D bottomLeftCorner = new Rectangle2D.Double(0, height - a, a, a);
|
|
Rectangle2D bottomRightCorner = new Rectangle2D.Double(width - a, height - a, a, a);
|
|
|
|
g2d.setPaint(CornerGradientStyle.TOP_LEFT.getGradientPaint(topLeftCorner, a, bg, faded));
|
|
g2d.fill(topLeftCorner);
|
|
|
|
g2d.setPaint(CornerGradientStyle.TOP_RIGHT.getGradientPaint(topRightCorner, a, bg, faded));
|
|
g2d.fill(topRightCorner);
|
|
|
|
g2d.setPaint(CornerGradientStyle.BOTTOM_LEFT.getGradientPaint(bottomLeftCorner, a, bg, faded));
|
|
g2d.fill(bottomLeftCorner);
|
|
|
|
g2d.setPaint(CornerGradientStyle.BOTTOM_RIGHT.getGradientPaint(bottomRightCorner, a, bg, faded));
|
|
g2d.fill(bottomRightCorner);
|
|
}
|
|
|
|
|
|
@Override
|
|
public Insets getBorderInsets(Component c) {
|
|
return getBorderInsets(c, new Insets(0, 0, 0, 0));
|
|
}
|
|
|
|
|
|
@Override
|
|
public Insets getBorderInsets(Component c, Insets insets) {
|
|
insets.top = insets.left = Math.max(smoothness - offset, 4);
|
|
insets.bottom = insets.right = Math.max(smoothness + offset, 4);
|
|
return insets;
|
|
}
|
|
|
|
|
|
private static enum CornerGradientStyle {
|
|
TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT;
|
|
|
|
public RadialGradientPaint getGradientPaint(RectangularShape shape, float radius, Color gradientBeginColor, Color gradientEndColor) {
|
|
Point2D center = null;
|
|
|
|
switch (this) {
|
|
case TOP_LEFT:
|
|
center = new Point2D.Double(shape.getX() + radius, shape.getY() + radius);
|
|
break;
|
|
|
|
case TOP_RIGHT:
|
|
center = new Point2D.Double(shape.getX() + 0, shape.getY() + radius);
|
|
break;
|
|
|
|
case BOTTOM_LEFT:
|
|
center = new Point2D.Double(shape.getX() + radius, shape.getY() + 0);
|
|
break;
|
|
|
|
case BOTTOM_RIGHT:
|
|
center = new Point2D.Double(shape.getX() + 0, shape.getY() + 0);
|
|
break;
|
|
|
|
default:
|
|
return null;
|
|
}
|
|
|
|
float[] dist = { 0.0f, 1.0f };
|
|
Color[] colors = { gradientBeginColor, gradientEndColor };
|
|
|
|
return new RadialGradientPaint(center, radius, dist, colors);
|
|
}
|
|
}
|
|
|
|
}
|