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