package javacodebook.media.text.shadow;

import java.awt.*;
import javax.swing.*;

/**
 * Ein Label, dessen Text einen Schatten wirft.
 */
public class ShadowedLabel extends javax.swing.JPanel {
    private String text;
    private Color fontColor, shadowColor;
    private int xOffset, yOffset;

    /**
     * Eine neue Instanz von ShadowLabel erzeugen.
     * @param text - der anzuzeigende Text
     * @param fontColor - die Vordergrund-Farbe
     * @param shadowColor - die Schatten-Farbe
     * @param xOffset, yOffset - Entfernung des Schattens von der Schrift. Diese
     *  Werte müssen positiv sein, da sonst der Schatten oberhalb der Schrift
     *  geworfen wird.
     */
    public ShadowedLabel(String text, Color fontColor, Color shadowColor,
                         int xOffset, int yOffset) {
        this.text = text;
        this.fontColor= fontColor;
        this.shadowColor = shadowColor;
        if(xOffset < 0 || yOffset < 0)
            throw new IllegalArgumentException("Offset muss positiv sein");
        this.xOffset = xOffset;
        this.yOffset = yOffset;
    }

    /**
     * Hier wird der Text zunächst leicht versetzt als Schatten gezeichnet, dann
     * in seiner eigentlichen Farbe an der normalen Position
     */
    public void paintComponent(Graphics g) {
        //Das Panel korrekt darstellen
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        //Den Ursprung so verschieben, dass der Offset des Schattens
        //berücksichtigt wird
        g2.translate(xOffset, yOffset);
        //Den Schatten zeichnen
        g2.setColor(shadowColor);
        g2.drawString(text, 0, 0 + getFont().getSize());
        //Ursprung wieder zurückverschieben
        g2.translate(-xOffset, -yOffset);
        //Den Text zeichnen
        g2.setColor(fontColor);
        g2.drawString(text, 0, 0 + getFont().getSize());
    }

    /**
     * Das Panel hat eine optimale Größe, die von der Schriftart und -größe
     * abhängt. Diese werden hier berechnet.
     */
    public Dimension getPreferredSize() {
        //Zur Laufweitenberechnung wird ein FontMetrics-Objekt benötigt
        FontMetrics fm = getFontMetrics(getFont());
        //Länge des Textes in Pixel berechnen
        int width = fm.stringWidth(text) + xOffset;
        //Schriftgröße als Höhe
        int height = fm.getHeight();
        return new Dimension(width, height);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new BorderLayout());
        ShadowedLabel l = new ShadowedLabel("Schattenwurf", Color.white,
                                            Color.black,
                                            3, 3);
        Font font = new Font("Helvetica", Font.BOLD, 36);
        l.setFont(font);
        f.getContentPane().add(l, BorderLayout.CENTER);
        f.pack();
        f.show();
    }
}
