package javacodebook.media.text.texture;

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

/**
 * Ein Textlabel, das mit einer beliebigen Grafik texturiert werden kann.
 */
public class TextureLabel extends javax.swing.JPanel {
    private String text;
    private TexturePaint paint;

    /**
     * Erzeugt ein neues TextureLabel mit dem angegebenen Text und der angegebenen
     * Grafik als Textur.
     */
    public TextureLabel(String text, Image image) {
        this.text = text;
        //Die Größe der Grafik ermitteln
        int width = image.getWidth(this), height = image.getHeight(this);
        //Ein entsprechend grosses BufferedImage erzeugen
        BufferedImage buf = new BufferedImage(width, height, Transparency.OPAQUE);
        //Ein Graphics2D-Objekt erzeugen, mit dem in das BufferedImage
        //gezeichnet werden kann
        Graphics2D g = buf.createGraphics();
        //Die Grafik in das BufferedImage zeichnen
        g.drawImage(image, 0,0, this);
        //Eine Texturfüllung erzeugen, die auf der Grafik basiert
        paint = new TexturePaint(buf, new Rectangle(0,0,width, height));
    }

    /**
     * Text mit eingeschaltetem Antialising zeichnen.
     */
    public void paintComponent(Graphics g) {
        //Das Panel korrekt darstellen
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        //Antialiasing einschalten, damit keine unschönen Ränder auftreten
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                  RenderingHints.VALUE_ANTIALIAS_ON);
        //Die Texturfüllung als Füllmuster verwenden
        g2.setPaint(paint);
        //Den Text zeichnen
        g2.drawString(text, 0, 0 + getFont().getSize());
    }

    /** Die bevorzugte Größe für den Text berechnent  */
    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);
        //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());
        ImageIcon icon = new ImageIcon(f.getClass().getClassLoader().
            getSystemResource("javacodebook/media/text/texture/Textur.jpg"));
        TextureLabel l = new TextureLabel("Texturiert",
                        icon.getImage());
        Font font = new Font("Helvetica", Font.BOLD, 64);
        l.setFont(font);
        f.getContentPane().add(l, BorderLayout.NORTH);
        f.pack();
        f.show();
    }
}
