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