AngledTextExample.java

/*
 * ChartExample.java
 *
 * Copyright (C) 2004-05 Side of Software (SOS)
 * All rights reserved.
 *
 *    http://www.sideofsoftware.com
 *    info@sideofsoftware.com
 */

package sos.examples;

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import sos.reports.*;
import sos.reports.Element;

/**
 * Sample application that uses Side of Software's Report Library
 * and illustrates vertical text and custom renderers.<p>
 *
 * @author  Side of Software
 */
public class AngledTextExample
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater( new Runnable() {
      public void run()
      {
        final JFrame frame = new JFrame( "Vertical Text Demo by Side of Software" );

        Object[][] data = new Object[][] {
          { null, "Archery", "Badminton", "Baseball", "Basketball", "Beach Volleyball", "Boxing", "Canoe / Kayak", "Cycling", "Diving", "Equestrian", "Fencing", "Field Hockey", "Gymnastics", "Handball", "Judo", "Modern Pentathlon", "Rhythmic Gymnastics", "Rowing", "Sailing", "Shooting", "Soccer", "Softball", "Swimming", "Synchronized Swimming", "Taekwondo", "Table Tennis", "Tennis", "Track and Field", "Trampoline", "Triathlon", "Volleyball", "Water Polo", "Weightlifing", "Wrestling" },
          { "1956 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, },
          { "1960 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "1964 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "1968 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "1972 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "1976 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "1980 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "1984 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "1988 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "1992 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "1996 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "2000 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
          { "2004 Olympics", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null },
        };

        // initialize the values randomly
        Random random = new Random( 100 );
        for( int i = 1; i < data[0].length; i++ )
          for( int j = 1; j < 14; j++ )
          {
            int v = random.nextInt( 3 );
            if( v == 0 )
              data[j][i] = Boolean.TRUE;
          }

        ReportTemplate template = new TableReportTemplate( "Table Template", 1, 1, 0, 0 );

        DefaultTableFormat tableFormat = new DefaultTableFormat();
        MutableAttributeSet tableAttributes = new SimpleAttributeSet();
        ReportStyleConstants.setHorizontalGridThickness( tableAttributes, 1 );
        ReportStyleConstants.setVerticalGridThickness( tableAttributes, 1 );
        ReportStyleConstants.setWrapped( tableAttributes, false );
        tableFormat.setTableAttributes( tableAttributes );
        MutableAttributeSet headerRowAttributes = new SimpleAttributeSet();
        ReportStyleConstants.setRotation( headerRowAttributes, Math.toRadians( -90.0 ));
        ReportStyleConstants.setVerticalAlignment( headerRowAttributes, StyleConstants.ALIGN_CENTER );
        ReportStyleConstants.setVerticalAlignment( headerRowAttributes, ReportStyleConstants.ALIGN_BOTTOM );
        tableFormat.setRowAttributes( headerRowAttributes, DefaultTableFormat.HEADER );
        MutableAttributeSet columnAttributes = new SimpleAttributeSet();
        ElementRenderer checkBoxRenderer = new CheckBoxElementRenderer();
        ReportStyleConstants.setRenderer( columnAttributes, checkBoxRenderer );
        for( int i = 1; i < data[0].length; i++ )
          tableFormat.setColumnCellAttributes( columnAttributes, i, DefaultTableFormat.BODY );
        StyleContext styleContext = new StyleContext();
        Style tableStyle = styleContext.addStyle( "Table", null );
        ReportStyleConstants.setTableFormat( tableStyle, tableFormat );
        Theme theme = new DefaultTheme( "Default", styleContext );
        final Report report = template.createReport( data, theme );
        final JReportPane reportPane = new JReportPane( report );
        JScrollPane scrollPane = new JScrollPane( reportPane );
        frame.getContentPane().add( scrollPane );

        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setSize( 800, 500 );
        frame.show();
      }
    } );
  }

  /**
   * An element renderer that displays Boolean values with
   * a check box.
   */
  static class CheckBoxElementRenderer implements ElementRenderer
  {
    // if the value is null, we'll use a blank label; otherwise, we'll
    // use a checkbox
    static final private Component BLANK = new JLabel();
    private JCheckBox checkBox = new JCheckBox();

    public CheckBoxElementRenderer()
    {
      super();
      checkBox.setHorizontalAlignment( JLabel.CENTER );
      checkBox.setOpaque( false );
      Icon icon = new Icon() {
        public int getIconHeight()
        {
          return 13;
        }
        
        public int getIconWidth()
        {
          return 13;
        }
        
        public void paintIcon( Component c, Graphics g, int x, int y )
        {
          g.fillRect( x + 3, y + 5, 2, 5 );
          g.drawLine( x + 9, y + 3, x + 5, y + 7 );
          g.drawLine( x + 9, y + 4, x + 5, y + 8 );
        }
      };
      
      checkBox.setIcon( icon );
    }

    public Component getElementRendererComponent(JReportPane reportPane, Element element)
    {
      Boolean object = (Boolean)element.getObject();

      // don't use a checkbox if null
      if( object == null )
        return BLANK;

      // initialize the checkbox appropriately
      boolean selected = object != null && object.booleanValue();
      checkBox.setSelected( selected );
      return checkBox;
    }
  }
}