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