001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.history;
003
004import java.awt.event.FocusEvent;
005import java.awt.event.FocusListener;
006
007import javax.swing.JTable;
008import javax.swing.ListSelectionModel;
009
010/**
011 * TagInfoViewer is a UI component which displays the list of tags of two
012 * version of a {@link org.openstreetmap.josm.data.osm.OsmPrimitive} in a {@link org.openstreetmap.josm.data.osm.history.History}.
013 *
014 * <ul>
015 *   <li>on the left, it displays the list of tags for the version at {@link PointInTimeType#REFERENCE_POINT_IN_TIME}</li>
016 *   <li>on the right, it displays the list of tags for the version at {@link PointInTimeType#CURRENT_POINT_IN_TIME}</li>
017 * </ul>
018 *
019 */
020public class TagInfoViewer extends HistoryViewerPanel {
021    private static final class RepaintOnFocusChange implements FocusListener {
022        @Override
023        public void focusLost(FocusEvent e) {
024            repaintSelected(e);
025        }
026
027        @Override
028        public void focusGained(FocusEvent e) {
029            repaintSelected(e);
030        }
031
032        private static void repaintSelected(FocusEvent e) {
033            // we would only need the selected rows, but this is easier:
034            e.getComponent().repaint();
035        }
036    }
037
038    /**
039     * Constructs a new {@code TagInfoViewer}.
040     * @param model The history browsing model
041     */
042    public TagInfoViewer(HistoryBrowserModel model) {
043        super(model);
044    }
045
046    @Override
047    protected JTable buildReferenceTable() {
048        JTable table = new JTable(
049                model.getTagTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME),
050                new TagTableColumnModel()
051        );
052        table.setName("table.referencetagtable");
053        setUpDataTransfer(table);
054        return table;
055    }
056
057    @Override
058    protected JTable buildCurrentTable() {
059        JTable table = new JTable(
060                model.getTagTableModel(PointInTimeType.CURRENT_POINT_IN_TIME),
061                new TagTableColumnModel()
062        );
063        table.setName("table.currenttagtable");
064        setUpDataTransfer(table);
065        return table;
066    }
067
068    private void setUpDataTransfer(JTable table) {
069        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
070        selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel());
071        table.setTransferHandler(new TagInfoTransferHandler());
072        table.addFocusListener(new RepaintOnFocusChange());
073    }
074}