001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.history; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.BorderLayout; 007import java.awt.Dimension; 008 009import javax.swing.JPanel; 010import javax.swing.JScrollPane; 011import javax.swing.JSplitPane; 012import javax.swing.JTabbedPane; 013 014import org.openstreetmap.josm.data.osm.OsmPrimitive; 015import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 016import org.openstreetmap.josm.data.osm.history.History; 017 018/** 019 * HistoryBrowser is an UI component which displays history information about an {@link OsmPrimitive}. 020 * 021 * 022 */ 023public class HistoryBrowser extends JPanel { 024 025 /** the model */ 026 private transient HistoryBrowserModel model; 027 private TagInfoViewer tagInfoViewer; 028 private NodeListViewer nodeListViewer; 029 private RelationMemberListViewer relationMemberListViewer; 030 private CoordinateInfoViewer coordinateInfoViewer; 031 private JTabbedPane tpViewers; 032 033 /** 034 * Constructs a new {@code HistoryBrowser}. 035 */ 036 public HistoryBrowser() { 037 model = new HistoryBrowserModel(); 038 build(); 039 } 040 041 /** 042 * Constructs a new {@code HistoryBrowser}. 043 * @param history the history of an {@link OsmPrimitive} 044 */ 045 public HistoryBrowser(History history) { 046 this(); 047 populate(history); 048 } 049 050 /** 051 * creates the table which shows the list of versions 052 * 053 * @return the panel with the version table 054 */ 055 protected JPanel createVersionTablePanel() { 056 JPanel pnl = new JPanel(new BorderLayout()); 057 pnl.add(new JScrollPane(new VersionTable(model)), BorderLayout.CENTER); 058 return pnl; 059 } 060 061 /** 062 * creates the panel which shows information about two different versions 063 * of the same {@link OsmPrimitive}. 064 * 065 * @return the panel 066 */ 067 protected JPanel createVersionComparePanel() { 068 tpViewers = new JTabbedPane(); 069 070 // create the viewers, but don't add them yet. 071 // see populate() 072 // 073 tagInfoViewer = new TagInfoViewer(model); 074 nodeListViewer = new NodeListViewer(model); 075 relationMemberListViewer = new RelationMemberListViewer(model); 076 coordinateInfoViewer = new CoordinateInfoViewer(model); 077 JPanel pnl = new JPanel(new BorderLayout()); 078 pnl.add(tpViewers, BorderLayout.CENTER); 079 080 tpViewers.addChangeListener(e -> { 081 if (tpViewers.getSelectedComponent() == coordinateInfoViewer) { 082 // while building the component size is not yet known, thus panning does not give reasonable results 083 coordinateInfoViewer.setDisplayToFitMapMarkers(); 084 } 085 }); 086 087 return pnl; 088 } 089 090 /** 091 * builds the GUI 092 */ 093 protected void build() { 094 JPanel left = createVersionTablePanel(); 095 JPanel right = createVersionComparePanel(); 096 setLayout(new BorderLayout()); 097 JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right); 098 add(pane, BorderLayout.CENTER); 099 100 pane.setOneTouchExpandable(true); 101 pane.setDividerLocation(300); 102 103 Dimension minimumSize = new Dimension(100, 50); 104 left.setMinimumSize(minimumSize); 105 right.setMinimumSize(minimumSize); 106 } 107 108 109 /** 110 * populates the browser with the history of a specific {@link OsmPrimitive} 111 * 112 * @param history the history 113 */ 114 public void populate(History history) { 115 model.setHistory(history); 116 117 tpViewers.removeAll(); 118 119 tpViewers.add(tagInfoViewer); 120 tpViewers.setTitleAt(0, tr("Tags")); 121 122 if (history.getEarliest().getType().equals(OsmPrimitiveType.NODE)) { 123 tpViewers.add(coordinateInfoViewer); 124 tpViewers.setTitleAt(1, tr("Coordinates")); 125 } else if (history.getEarliest().getType().equals(OsmPrimitiveType.WAY)) { 126 tpViewers.add(nodeListViewer); 127 tpViewers.setTitleAt(1, tr("Nodes")); 128 } else if (history.getEarliest().getType().equals(OsmPrimitiveType.RELATION)) { 129 tpViewers.add(relationMemberListViewer); 130 tpViewers.setTitleAt(1, tr("Members")); 131 } 132 revalidate(); 133 } 134 135 /** 136 * replies the {@link History} currently displayed by this browser 137 * 138 * @return the current history 139 */ 140 public History getHistory() { 141 return model.getHistory(); 142 } 143 144 /** 145 * replies the model used by this browser 146 * @return the model 147 */ 148 public HistoryBrowserModel getModel() { 149 return model; 150 } 151}