View Javadoc

1   package baseCode.gui.table;
2   
3   import java.awt.Color;
4   import java.awt.Component;
5   import java.awt.Graphics;
6   import java.awt.Rectangle;
7   import java.text.DecimalFormat;
8   import java.util.ArrayList;
9   
10  import javax.swing.JLabel;
11  import javax.swing.JTable;
12  import javax.swing.UIManager;
13  import javax.swing.border.Border;
14  import javax.swing.border.EmptyBorder;
15  import javax.swing.table.TableCellRenderer;
16  
17  /***
18   * @author Will Braynen
19   * @version $Id: JBarGraphCellRenderer.java,v 1.10 2005/03/21 18:01:04 pavlidis Exp $
20   */
21  public class JBarGraphCellRenderer extends JLabel implements TableCellRenderer {
22  
23     protected Object m_values = null;
24     protected final static int LINE_WIDTH = 2;
25     protected final static Color[] COLORS = {
26           Color.BLUE, Color.GRAY, Color.RED, Color.GREEN, Color.CYAN,
27           Color.MAGENTA, Color.ORANGE
28     };
29     protected static Border m_noFocusBorder = new EmptyBorder( 1, 1, 1, 1 );
30     protected static Color m_selectionBackground;
31     protected boolean m_isSelected = false;
32     protected boolean m_isBarGraph = false;
33     DecimalFormat m_regular = new DecimalFormat();
34  
35     public JBarGraphCellRenderer() {
36        super();
37        setOpaque( false );
38        setBorder( m_noFocusBorder );
39     }
40  
41     /***
42      * This method is called each time a cell in a column using this renderer needs to be rendered.
43      * 
44      * @param table the <code>JTable</code>
45      * @param value the value to assign to the cell at <code>[row, column]</code>
46      * @param isSelected true if cell is selected
47      * @param hasFocus true if cell has focus
48      * @param row the row of the cell to render
49      * @param column the column of the cell to render
50      * @return the default table cell renderer
51      */
52     public Component getTableCellRendererComponent( JTable table, Object value,
53           boolean isSelected, boolean hasFocus, int row, int column ) {
54  
55        m_values = value;
56  
57        // set background
58        m_isSelected = isSelected;
59        if ( isSelected ) {
60           super.setBackground( m_selectionBackground = table
61                 .getSelectionBackground() );
62        } else {
63           super.setBackground( table.getBackground() );
64           // or force a white background instead
65        }
66  
67        if ( hasFocus ) {
68           setBorder( UIManager.getBorder( "Table.focusCellHighlightBorder" ) );
69        } else {
70           setBorder( m_noFocusBorder );
71        }
72  
73        m_isBarGraph = false;
74        if ( value.getClass().equals( ArrayList.class ) ) {
75           // bar graph
76           m_isBarGraph = true;
77           m_values = value;
78  
79  //         Double x = new Double( ( ( Double ) ( ( ArrayList ) value ).get( 0 ) )
80  //               .doubleValue() );
81  
82           //        
83           //            x = new Double( m_regular.format( -Math
84           //                  .log( ( ( Double ) ( ( ArrayList ) value ).get( 0 ) )
85           //                        .doubleValue() )
86           //                  / Math.log( 10 ) ) );
87  
88           //      setToolTipText( x.toString() );
89        } else if ( value.getClass().equals( Double.class ) ) {
90           // just double value, no bar graph
91           setText( value.toString() );
92           setFont( table.getFont() );
93        }
94  
95        // Since the renderer is a component, return itself
96        return this;
97     }
98  
99     protected void paintBackground( Graphics g ) {
100       g.setColor( m_selectionBackground );
101       g.fillRect( 0, 0, getWidth(), getHeight() );
102    }
103 
104    protected void paintComponent( Graphics g ) {
105 
106       if ( m_isSelected ) {
107          paintBackground( g );
108       }
109 
110       super.paintComponent( g );
111 
112       if ( !m_isBarGraph ) return;
113       if ( m_values == null ) return;
114 
115       final int width = getWidth();
116       final int height = getHeight();
117       final int y = 0;
118 
119       ArrayList values = ( ArrayList ) m_values;
120 
121       double maxPval = 10.0;
122 
123       for ( int i = 0; i < values.size(); i++ ) {
124 
125          // @todo only use log if doLog is requested. probably log should be in genesettablemodel
126          double val = ( ( Double ) values.get( i ) ).doubleValue();
127          double logval = 0.0;
128 
129          if ( val > 0 && val <= 1.0 ) {
130             logval = Math.min( maxPval, -Math.log( val ) / Math.log( 10 ) );
131          }
132 
133          if ( !Double.isNaN( logval ) ) {
134             // map from [0,1] range to [0,width] range
135             // int x = ( int ) ( value * width );
136             int x = ( int ) ( width * logval / maxPval );
137 
138             // what color to use?
139             if ( i < COLORS.length ) {
140                g.setColor( COLORS[i] );
141             } else {
142                // ran out of colors!
143                g.setColor( Color.LIGHT_GRAY );
144             }
145 
146             // draw the vertical bar line
147             if ( x > width ) x = width - LINE_WIDTH;
148             g.fillRect( x, y, LINE_WIDTH, height );
149          }
150       }
151    } // end paintComponent
152 
153    public void validate() {
154    }
155 
156    public void revalidate() {
157    }
158 
159    public void repaint( long tm, int x, int y, int width, int height ) {
160    }
161 
162    public void repaint( Rectangle r ) {
163    }
164 
165 } // end class