package com.dlsc.flexgantt.showcase.demo.layers;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;

import javax.swing.JPanel;

import com.dlsc.flexgantt.model.gantt.TimelineObjectPath;
import com.dlsc.flexgantt.swing.layer.timeline.ITimelineObjectRenderer;
import com.dlsc.flexgantt.swing.layer.timeline.TimelineObjectLayer;

/**
 * A specialized timeline object renderer, which will draw events as circles and
 * activities as bars that fill the entire row height. The circles and the bars
 * display the layer number.
 * 
 * @author Dirk Lemmermann
 * @version $Revision: 1.8 $
 */
public class LayerDemoObjectRenderer extends JPanel implements
        ITimelineObjectRenderer {
    private final Insets INSETS = new Insets(0, -10, 0, -10);
    private String number;
    private Color color;
    private boolean event;
    private boolean selected;

    public LayerDemoObjectRenderer() {
        setFont(new Font("helvetica", Font.BOLD, 12));
        setOpaque(false);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int w = getWidth();
        int h = getHeight();
        Graphics2D g2d = (Graphics2D) g;
        g.setColor(color);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        if (event) {
            g2d.fillOval(w / 2 - Math.min(w - 2, h - 2) / 2, h / 2
                    - Math.min(w - 2, h - 2) / 2, Math.min(w - 2, h - 2), Math
                    .min(w - 2, h - 2));
        } else {
            g2d.fillRect(0, 0, w, h);
        }
        g2d.setColor(Color.WHITE);
        int a = g2d.getFontMetrics().getAscent();
        int l = g2d.getFontMetrics().stringWidth(number);
        g2d.drawString(number, w / 2 - l / 2 + 1, h / 2 + a / 2);
        if (selected) {
            g2d.setColor(Color.BLACK);
        } else {
            g2d.setColor(Color.RED);
        }
        if (event) {
            g2d.drawOval(w / 2 - Math.min(w - 2, h - 2) / 2, h / 2
                    - Math.min(w - 2, h - 2) / 2, Math.min(w - 2, h - 2), Math
                    .min(w - 2, h - 2));
        } else {
            g2d.drawRect(0, 0, w - 1, h - 1);
        }
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_DEFAULT);
    }

    @Override
    @SuppressWarnings("unchecked")
    public Component getTimelineObjectRendererComponent(
            TimelineObjectLayer layer, TimelineObjectPath path,
            boolean selected, boolean focus, boolean highlighted, int row) {
        LayerDemoLayer l = (LayerDemoLayer) layer.getLayer();
        number = Integer.toString(l.getNumber());
        color = l.getColor();
        event = layer.getModel().getTimeSpan(path.getTimelineObject())
                .isEvent();
        this.selected = selected;
        return this;
    }

    @Override
    public Insets getTimelineObjectRendererInsets(int x, int y, int width,
            int height) {
        return INSETS;
    }
}
