// University of California, Santa Cruz, USA and
// CERN, Geneva, Switzerland, Copyright (c) 2000
package org.freehep.graphicsio.test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;

import javax.swing.border.*;

import java.io.FileOutputStream;
import java.io.OutputStream;

import org.freehep.graphics2d.*;
import org.freehep.graphicsio.*;
import org.freehep.graphicsio.exportchooser.*;

/**
 * @author Charles Loomis
 * @version $Id: TestLineStyles.java,v 1.5 2003/05/02 18:00:13 duns Exp $
 */
public class TestLineStyles
    extends TestingPanel {

    static float[] dash1 = new float[2];
    static {
        dash1[0] = 5.f;
        dash1[1] = 2.f;
    }

    static float[] dash2 = new float[2];
    static {
        dash2[0] = 0.f;
        dash2[1] = 7.f;
    }

    static float[] dash3 = new float[4];
    static {
        dash3[0] = 10.f;
        dash3[1] = 5.f;
        dash3[2] = 2.f;
        dash3[3] = 5.f;
    }

    static Stroke[][] strokes = new Stroke[3][3];

    static {
        strokes[0][0] = new BasicStroke(3.f,
                                        BasicStroke.CAP_BUTT,
                                        BasicStroke.JOIN_BEVEL,
                                        10.f,
                                        dash1,
                                        0.f);
        strokes[0][1] = new BasicStroke(5.f,
                                        BasicStroke.CAP_BUTT,
                                        BasicStroke.JOIN_BEVEL,
                                        10.f,
                                        dash1,
                                        0.f);
        strokes[0][2] = new BasicStroke(20.f,
                                        BasicStroke.CAP_BUTT,
                                        BasicStroke.JOIN_BEVEL,
                                        10.f);
        strokes[1][0] = new BasicStroke(3.f,
                                        BasicStroke.CAP_ROUND,
                                        BasicStroke.JOIN_MITER,
                                        10.f,
                                        dash2,
                                        0.f);
        strokes[1][1] = new BasicStroke(5.f,
                                        BasicStroke.CAP_ROUND,
                                        BasicStroke.JOIN_MITER,
                                        10.f,
                                        dash2,
                                        0.f);
        strokes[1][2] = new BasicStroke(20.f,
                                        BasicStroke.CAP_ROUND,
                                        BasicStroke.JOIN_MITER,
                                        10.f);
        strokes[2][0] = new BasicStroke(3.f,
                                        BasicStroke.CAP_SQUARE,
                                        BasicStroke.JOIN_ROUND,
                                        10.f,
                                        dash3,
                                        0.f);
        strokes[2][1] = new BasicStroke(5.f,
                                        BasicStroke.CAP_SQUARE,
                                        BasicStroke.JOIN_ROUND,
                                        10.f,
                                        dash3,
                                        0.f);
        strokes[2][2] = new BasicStroke(20.f,
                                        BasicStroke.CAP_SQUARE,
                                        BasicStroke.JOIN_ROUND,
                                        10.f);
    }

    public TestLineStyles(String[] args) throws Exception {
        super(args);
        setName("Line Styles");
    }

    public void paintComponent(Graphics g) {

        if (g!=null) {

            VectorGraphics vg =
                VectorGraphics.create(g);

            Dimension dim = getSize();
            Insets insets = getInsets();

            vg.setColor(Color.white);
            vg.fillRect(insets.left, insets.top,
                        dim.width-insets.left-insets.right,
                        dim.height-insets.top-insets.bottom);

            int dw = dim.width/3;
            int dh = dim.height/3;

            int size = (Math.min(dw,dh)*2/3)/2;

            vg.setColor(Color.black);

            // thinnest line possible
            vg.setStroke(new BasicStroke(0.0f));
            vg.drawLine(0, dim.height/40, dim.width, dim.height/40);

            GeneralPath sshape = new GeneralPath();
            sshape.moveTo(size,size);
            sshape.lineTo(-size,size);
            sshape.lineTo(-size,size/2);
            sshape.lineTo(size,size/2);
            sshape.lineTo(size,-size/2);
            sshape.lineTo(-size,-size/2);
            sshape.lineTo(-size,-size);
            sshape.lineTo(size,-size);

            for (int iy=0; iy<3; iy++) {
                int y = iy*dh+dh/2;
                for (int ix=0; ix<3; ix++) {
                    int x = ix*dw+dw/2;

                    vg.setStroke(strokes[ix][iy]);

                    AffineTransform xform =
                        AffineTransform.getTranslateInstance((double) x,
                                                             (double) y);
                    vg.draw(sshape.createTransformedShape(xform));
                }
            }

        }
    }

    public static void main(String[] args) throws Exception {
        new TestLineStyles(args).runTest();
    }
}
