/*
 * (C) 2004 - Geotechnical Software Services
 * 
 * This code is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public 
 * License as published by the Free Software Foundation; either 
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This code is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public 
 * License along with this program; if not, write to the Free 
 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, 
 * MA  02111-1307, USA.
 */
import java.awt.*;
import java.util.*;

import javax.swing.*;

import no.geosoft.cc.geometry.Geometry;
import no.geosoft.cc.graphics.*;



/**
 * G demo program. Demonstrates:
 *
 * <ul>
 * <li>A rudimentory bar chart class
 * <li>Rendering techniques
 * </ul>
 * 
 * @author <a href="mailto:info@geosoft.no">GeoSoft</a>
 */   
public class Demo17 extends JFrame
{
  public Demo17()
  {
    super ("G Graphics Library - Demo 17");    
    setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    
    // Create the graphic canvas
    GWindow window = new GWindow();
    getContentPane().add (window.getCanvas());
    
    // Create scane with default viewport and world extent settings
    GScene scene = new GScene (window);

    GStyle chartStyle = new GStyle();
    chartStyle.setLineStyle (GStyle.LINESTYLE_INVISIBLE);
    chartStyle.setFont (new Font ("Dialog", Font.BOLD, 12));
    chartStyle.setForegroundColor (new Color (0, 0, 0));
    
    BarChart barChart = new BarChart (50, 450, 400, 400);
    barChart.setStyle (chartStyle);

    barChart.addBar ("1998", 250, getColor());
    barChart.addBar ("1999", 150, getColor());
    barChart.addBar ("2000",  80, getColor());
    barChart.addBar ("2001", 174, getColor());
    barChart.addBar ("2002", 350, getColor());
    barChart.addBar ("2003",  40, getColor());    
    barChart.addBar ("2004", 100, getColor());
    barChart.addBar ("2005", 150, getColor());    

    scene.add (barChart);
    
    pack();
    setSize (new Dimension (500, 500));
    setVisible (true);
  }


  
  private Color getColor()
  {
    return new Color (Color.HSBtoRGB ((float)Math.random(), 0.2f, 0.8f));
  }
  
    

  private class BarChart extends GObject
  {
    private int         x_, y_, width_, height_;
    private Collection  bars_;
    
    
    BarChart (int x, int y, int width, int height)
    {
      x_      = x;
      y_      = y;
      width_  = width;
      height_ = height;
      
      bars_ = new ArrayList();
    }


    
    void addBar (String label, int value, Color color)
    {
      bars_.add (new Bar (label, value, color));
    }
    

    
    public void draw()
    {
      final int BAR_WIDTH = 30;
      final int SPACING   = 15;
      final int DEPTH     = 20;
      
      removeSegments();

      int x0 = x_ + 10;

      double angle0 = 0.0;
      for (Iterator i = bars_.iterator(); i.hasNext(); ) {
        Bar bar = (Bar) i.next();

        int y0 = y_ - bar.value;
        
        GSegment main = new GSegment();
        addSegment (main);
        GStyle style = new GStyle();
        style.setForegroundColor (bar.color);
        style.setBackgroundColor (bar.color);        
        main.setStyle (style);
        main.setGeometry (Geometry.createRectangle (x0, y0,
                                                    BAR_WIDTH, bar.value));

        GSegment label = new GSegment();
        addSegment (label);
        label.setGeometry (x0 + BAR_WIDTH / 2, y_ + 10);
        GText text = new GText (bar.label);
        label.setText (text);
        
        GSegment top = new GSegment();
        addSegment (top);
        style = new GStyle();
        style.setForegroundColor (bar.color.brighter());
        style.setBackgroundColor (bar.color.brighter());        
        top.setStyle (style);
        int topXy[] = {x0, y0,
                       x0 + BAR_WIDTH, y0,
                       x0 + BAR_WIDTH + DEPTH, y0 - DEPTH,
                       x0 + DEPTH, y0 - DEPTH,
                       x0, y0};
        top.setGeometry (topXy);

        GSegment side = new GSegment();
        addSegment (side);
        style = new GStyle();
        style.setForegroundColor (bar.color.darker());
        style.setBackgroundColor (bar.color.darker());        
        side.setStyle (style);
        int[] sideXy = {x0 + BAR_WIDTH, y0,
                        x0 + BAR_WIDTH + DEPTH, y0 - DEPTH,
                        x0 + BAR_WIDTH + DEPTH, y_ - DEPTH,
                        x0 + BAR_WIDTH, y_,
                        x0 + BAR_WIDTH, y0};
        side.setGeometry (sideXy);
        
        x0 += BAR_WIDTH + SPACING;
      }
    }
  }

  

  private class Bar
  {
    public String  label;
    public int     value;
    public Color   color;

    public Bar (String label, int value, Color color)
    {
      this.label = label;
      this.value = value;
      this.color = color;
    }
  }
  


  public static void main (String[] args)
  {
    new Demo17();
  }
}