/*
 * @(#)TestChart.java	1.3 04/01/27
 *
 * Copyright (c) 2000-2004 Sun Microsystems, Inc. All rights reserved. 
 * PROPRIETARY/CONFIDENTIAL
 * Use is subject to license terms
 */

package example.photoalbum;

import java.util.Vector;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


/**
 * A quick sample of graphics which generates a series of images 
 * that can be used as a sample animation.  The animation
 * consists of a title, a pie, and a bar chart.  The charts
 * are sized to the requested size so they will look good on
 * devices with various screen sizes.
 */
class TestChart {

    /** Width of the canvas */
    int     w;
    /** Height of the canvas */
    int h;
    /** Font used for drawing text */
    Font    font;
    /** height of the font */
    int     fh;   
    /** Height of the title */
    int     titleHeight;
    /** Padding used between items */
    int     pad;  
    /** Size of the Pie chart used for width and height */
    int     pieSize;
    /** Size of the Bar chart used for width and height */
    int     barSize;
    /** The current frame number */
    int     frameno;

    /**
     * Generate the frames for this animated chart.
     * It consists of hour frames with the first frame
     * containing only the base, and frame 2,3,4 adding
     * the colors to the bars of the bar chart.
     * @return the Vector of Images.
     */
    public Vector generateImages() {
        Vector v = new Vector(4);
        for (frameno = 0; frameno < 4; frameno++) {
            Image image = Image.createImage(w, h);
            paint(image.getGraphics());
            v.addElement(image);
        }
        return v;
    }

    /**
     * Initialize a new TestPattern to match the requested size.
     * @param width the requested width of the Images
     * @param height the requested height of the Images
     */
    public TestChart(int width, int height) {
        w = width;
        h = height;
        font = Font.getFont(Font.FACE_SYSTEM,
			    Font.STYLE_PLAIN, Font.SIZE_SMALL);
        fh = font.getHeight();

        /*
	 * Compute the sizes of the bar and pie charts
	 * It should use all the space except for the title and event regions
	 * Don't let the charts get too small
	 */
        pad = 2;
        titleHeight = fh + pad * 2;
        barSize = h - (titleHeight + pad);
        if (barSize < 10)               // Don't let them get too small
            barSize = 10;
        if (barSize > (w - pad) / 2)    // Shrink to 1/2 width
            barSize = (w - pad) / 2;
        pieSize = barSize;
    }

    /**
     * Draw the current frame.
     * The field frameno contains the current frame number.
     * @param g the Graphics context
     */
    public void paint(Graphics g) {
        g.setFont(font);
        g.setGrayScale(255);
        g.fillRect(0, 0, w, h);

        // Draw Fill and outline for background of title Text
        int swidth = pad * 2 + font.stringWidth("Chart Samples");
        int title_x = (w - swidth)/2;

        g.setGrayScale(128);
        g.fillRoundRect(title_x, 0, swidth, fh, 5, 5);
        g.setGrayScale(0);
        g.drawRoundRect(title_x, 0, swidth, fh, 5, 5);

        // Sample Text
        g.setColor(0, 0, 0);
        g.drawString("Chart Samples", 
		     title_x + pad, pad, Graphics.TOP|Graphics.LEFT);

        g.translate(0, titleHeight + pad);    // Translate to below title text

        // Draw pie chart on the left using the barSize for width and height
        g.setColor(255, 0, 0);
        g.fillArc(0, 0, pieSize, pieSize, 45, 270);
        g.setColor(0, 255, 0);
        g.fillArc(0, 0, pieSize, pieSize, 0, 45);
        g.setColor(0, 0, 255);
        g.fillArc(0, 0, pieSize, pieSize, 0, -45);
        g.setColor(0);
        g.drawArc(0, 0, pieSize, pieSize, 0, 360);

        // Draw Bar chart on right side of the display
        // scale the values to the pieSize maximum value
        int yorig = barSize;
        int h1 = barSize / 3, h2 = barSize / 2, h3 = barSize;
        int avg = (h1 + h2 + h3) / 3;

        // Move over to draw Bar chart
        g.translate((w + pad) / 2, 0);

        int bw = pieSize / 7;
        if (bw < 2)
             bw = 2;
        if (frameno > 0) {
            g.setColor(255, 0, 0);
            g.fillRect(bw*1, yorig-h1, bw+1, h1);
        }
        if (frameno > 1) {
            g.setColor(0, 255, 0);
            g.fillRect(bw*3, yorig-h2, bw+1, h2);
        }
        if (frameno > 2) {
            g.setColor(0, 0, 255);
            g.fillRect(bw*5, yorig-h3, bw+1, h3);
        }

        g.setColor(0);
        g.drawRect(bw*1, yorig-h1, bw, h1);
        g.drawRect(bw*3, yorig-h2, bw, h2);
        g.drawRect(bw*5, yorig-h3, bw, h3);

        // Draw axis for bar chart.
        g.setGrayScale(0);
        g.drawLine(0, 0, 0, yorig);
        g.drawLine(0, yorig, barSize, yorig);
        g.setStrokeStyle(Graphics.DOTTED);
        g.drawLine(0, yorig - avg, barSize, yorig-avg);
        g.setStrokeStyle(Graphics.SOLID);

	// Restore to left and move down
        g.translate(-(w + pad) / 2, pieSize + pad);
    }
}
