001    package org.shiftone.jrat.ui.util;
002    
003    
004    import org.shiftone.jrat.util.Percent;
005    import org.shiftone.jrat.util.log.Logger;
006    
007    import javax.swing.*;
008    import javax.swing.table.DefaultTableCellRenderer;
009    import java.awt.*;
010    import java.text.DecimalFormat;
011    
012    
013    /**
014     * @author jeff@shiftone.org (Jeff Drost)
015     */
016    public class PercentTableCellRenderer extends DefaultTableCellRenderer {
017    
018        private static final Logger LOG = Logger.getLogger(PercentTableCellRenderer.class);
019        private Object value = null;
020        private DecimalFormat floatDecimalFormat = new DecimalFormat("#,##0.00");
021        private DecimalFormat doubleDecimalFormat = new DecimalFormat("#,##0.00");
022        private DecimalFormat longDecimalFormat = new DecimalFormat("###,###,###");
023        private static final Color COLOR_XOR = Color.LIGHT_GRAY;
024    
025        public PercentTableCellRenderer() {
026            super();
027        }
028    
029    
030        public static void setDefaultRenderer(JTable table) {
031    
032            table.setDefaultRenderer(Object.class, new PercentTableCellRenderer());
033            table.setDefaultRenderer(Percent.class, new PercentTableCellRenderer());
034            table.setDefaultRenderer(Number.class, new PercentTableCellRenderer());
035            table.setDefaultRenderer(Integer.class, new PercentTableCellRenderer());
036            table.setDefaultRenderer(Long.class, new PercentTableCellRenderer());
037            table.setDefaultRenderer(Double.class, new PercentTableCellRenderer());
038            table.setDefaultRenderer(Float.class, new PercentTableCellRenderer());
039        }
040    
041    
042        /**
043         * Method getTableCellRendererComponent
044         */
045        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
046                                                       int row, int column) {
047    
048            this.value = value;
049    
050            if (value instanceof Number) {
051                setHorizontalAlignment(JLabel.RIGHT);
052            } else {
053                setHorizontalAlignment(JLabel.LEFT);
054            }
055    
056            return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
057    
058            // return this;
059        }
060    
061    
062        /**
063         * Method paint
064         */
065        public void paint(Graphics g) {
066    
067            super.paint(g);
068    
069            if (value instanceof Percent) {
070                double pct = ((Percent) value).doubleValue();
071    
072                if (pct > 100.0) {
073                    pct = 100.0;
074                }
075    
076                int w = (int) ((getWidth() * pct) / 100.0);
077    
078                g.setXORMode(COLOR_XOR);
079                g.fillRect(0, 0, w, getHeight());
080            }
081        }
082    
083    
084        /**
085         * Method setValue. synchronized because DecimalFormat is not thread safe
086         */
087        protected synchronized void setValue(Object value) {
088    
089            if (value == null) {
090                value = "";
091            } else if (value instanceof Number) {
092                Number num = (Number) value;
093    
094                if ((value instanceof Integer) || (value instanceof Long)) {
095                    value = longDecimalFormat.format(num);
096                } else if (value instanceof Float) {
097                    Float f = (Float) value;
098    
099                    if (f.isNaN() || f.isInfinite()) {
100                        value = String.valueOf(f);
101                    } else {
102                        value = floatDecimalFormat.format(num);
103                    }
104                } else if (value instanceof Double) {
105                    Double d = (Double) value;
106    
107                    if (d.isNaN() || d.isInfinite()) {
108                        value = String.valueOf(d);
109                    } else {
110                        value = doubleDecimalFormat.format(num);
111                    }
112                }
113            }
114    
115            super.setValue(value);
116        }
117    }