001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.corrector;
003
004import java.awt.Component;
005import java.awt.Dimension;
006import java.awt.Font;
007
008import javax.swing.JLabel;
009import javax.swing.JTable;
010import javax.swing.table.TableCellRenderer;
011
012public abstract class CorrectionTable<T extends CorrectionTableModel<?>>
013        extends JTable {
014
015    private static final int MAX_VISIBLE_LINES = 10;
016
017    public static class BoldRenderer extends JLabel implements
018            TableCellRenderer {
019
020        @Override
021        public Component getTableCellRendererComponent(JTable table,
022                Object value, boolean isSelected, boolean hasFocus, int row,
023                int column) {
024
025            Font f = getFont();
026            setFont(new Font(f.getName(), f.getStyle() | Font.BOLD, f.getSize()));
027
028            setText((String) value);
029
030            return this;
031        }
032    }
033
034    private static volatile BoldRenderer boldRenderer;
035
036    protected CorrectionTable(T correctionTableModel) {
037        super(correctionTableModel);
038
039        final int correctionsSize = correctionTableModel.getCorrections().size();
040        final int lines = correctionsSize > MAX_VISIBLE_LINES ? MAX_VISIBLE_LINES
041                : correctionsSize;
042        setPreferredScrollableViewportSize(new Dimension(400, lines
043                * getRowHeight()));
044        getColumnModel().getColumn(correctionTableModel.getApplyColumn())
045                .setPreferredWidth(40);
046        setRowSelectionAllowed(false);
047    }
048
049    @Override
050    public TableCellRenderer getCellRenderer(int row, int column) {
051        if (getCorrectionTableModel().isBoldCell(row, column)) {
052            if (boldRenderer == null)
053                boldRenderer = new BoldRenderer();
054            return boldRenderer;
055        }
056        return super.getCellRenderer(row, column);
057    }
058
059    @SuppressWarnings("unchecked")
060    public T getCorrectionTableModel() {
061        return (T) getModel();
062    }
063}