001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.history; 003 004import java.awt.Rectangle; 005 006import javax.swing.JTable; 007import javax.swing.ListSelectionModel; 008import javax.swing.event.TableModelEvent; 009import javax.swing.event.TableModelListener; 010 011/** 012 * RelationMemberListViewer is a UI component which displays the list of relation members of two 013 * version of a {@link org.openstreetmap.josm.data.osm.Relation} in a {@link org.openstreetmap.josm.data.osm.history.History}. 014 * 015 * <ul> 016 * <li>on the left, it displays the list of relation members for the version at {@link PointInTimeType#REFERENCE_POINT_IN_TIME}</li> 017 * <li>on the right, it displays the list of relation members for the version at {@link PointInTimeType#CURRENT_POINT_IN_TIME}</li> 018 * </ul> 019 * @since 1709 020 */ 021public class RelationMemberListViewer extends HistoryViewerPanel { 022 023 protected static class MemberModelChanged implements TableModelListener { 024 private final JTable table; 025 026 protected MemberModelChanged(JTable table) { 027 this.table = table; 028 } 029 030 @Override 031 public void tableChanged(TableModelEvent e) { 032 Rectangle rect = table.getCellRect(((DiffTableModel) e.getSource()).getFirstChange(), 0, true); 033 table.scrollRectToVisible(rect); 034 } 035 } 036 037 @Override 038 protected JTable buildReferenceTable() { 039 return buildTable(PointInTimeType.REFERENCE_POINT_IN_TIME, "table.referencememberlisttable"); 040 } 041 042 @Override 043 protected JTable buildCurrentTable() { 044 return buildTable(PointInTimeType.CURRENT_POINT_IN_TIME, "table.currentmemberlisttable"); 045 } 046 047 private JTable buildTable(PointInTimeType pointInTimeType, String name) { 048 JTable table = new JTable( 049 model.getRelationMemberTableModel(pointInTimeType), 050 new RelationMemberTableColumnModel()); 051 table.setName(name); 052 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 053 selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel()); 054 table.getModel().addTableModelListener(new MemberModelChanged(table)); 055 return table; 056 } 057 058 /** 059 * Constructs a new {@code RelationMemberListViewer}. 060 * @param model The history browsing model 061 */ 062 public RelationMemberListViewer(HistoryBrowserModel model) { 063 super(model); 064 } 065}