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 * creates the table which shows the list of versions 035 * 036 * @return the panel with the version table 037 */ 038 protected JPanel createVersionTablePanel() { 039 JPanel pnl = new JPanel(); 040 pnl.setLayout(new BorderLayout()); 041 042 VersionTable versionTable = new VersionTable(model); 043 pnl.add(new JScrollPane(versionTable), BorderLayout.CENTER); 044 return pnl; 045 } 046 047 /** 048 * creates the panel which shows information about two different versions 049 * of the same {@link OsmPrimitive}. 050 * 051 * @return the panel 052 */ 053 protected JPanel createVersionComparePanel() { 054 tpViewers = new JTabbedPane(); 055 056 // create the viewers, but don't add them yet. 057 // see populate() 058 // 059 tagInfoViewer = new TagInfoViewer(model); 060 nodeListViewer = new NodeListViewer(model); 061 relationMemberListViewer = new RelationMemberListViewer(model); 062 coordinateInfoViewer = new CoordinateInfoViewer(model); 063 JPanel pnl = new JPanel(); 064 pnl.setLayout(new BorderLayout()); 065 pnl.add(tpViewers, BorderLayout.CENTER); 066 return pnl; 067 } 068 069 /** 070 * builds the GUI 071 */ 072 protected void build() { 073 JPanel left; 074 JPanel right; 075 setLayout(new BorderLayout()); 076 JSplitPane pane = new JSplitPane( 077 JSplitPane.HORIZONTAL_SPLIT, 078 left = createVersionTablePanel(), 079 right = createVersionComparePanel() 080 ); 081 add(pane, BorderLayout.CENTER); 082 083 pane.setOneTouchExpandable(true); 084 pane.setDividerLocation(300); 085 086 Dimension minimumSize = new Dimension(100, 50); 087 left.setMinimumSize(minimumSize); 088 right.setMinimumSize(minimumSize); 089 } 090 091 /** 092 * constructor 093 */ 094 public HistoryBrowser() { 095 model = new HistoryBrowserModel(); 096 build(); 097 } 098 099 /** 100 * constructor 101 * @param history the history of an {@link OsmPrimitive} 102 */ 103 public HistoryBrowser(History history) { 104 this(); 105 populate(history); 106 } 107 108 /** 109 * populates the browser with the history of a specific {@link OsmPrimitive} 110 * 111 * @param history the history 112 */ 113 public void populate(History history) { 114 model.setHistory(history); 115 116 tpViewers.removeAll(); 117 118 tpViewers.add(tagInfoViewer); 119 tpViewers.setTitleAt(0, tr("Tags")); 120 121 if (history.getEarliest().getType().equals(OsmPrimitiveType.NODE)) { 122 tpViewers.add(coordinateInfoViewer); 123 tpViewers.setTitleAt(1, tr("Coordinates")); 124 } else if (history.getEarliest().getType().equals(OsmPrimitiveType.WAY)) { 125 tpViewers.add(nodeListViewer); 126 tpViewers.setTitleAt(1, tr("Nodes")); 127 } else if (history.getEarliest().getType().equals(OsmPrimitiveType.RELATION)) { 128 tpViewers.add(relationMemberListViewer); 129 tpViewers.setTitleAt(1, tr("Members")); 130 } 131 revalidate(); 132 } 133 134 /** 135 * replies the {@link History} currently displayed by this browser 136 * 137 * @return the current history 138 */ 139 public History getHistory() { 140 return model.getHistory(); 141 } 142 143 /** 144 * replies the model used by this browser 145 * @return the model 146 */ 147 public HistoryBrowserModel getModel() { 148 return model; 149 } 150}