// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.history;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
import org.openstreetmap.josm.data.osm.history.History;
/**
* HistoryBrowser is an UI component which displays history information about an {@link OsmPrimitive}.
*
*
*/
public class HistoryBrowser extends JPanel {
/** the model */
private transient HistoryBrowserModel model;
private TagInfoViewer tagInfoViewer;
private NodeListViewer nodeListViewer;
private RelationMemberListViewer relationMemberListViewer;
private CoordinateInfoViewer coordinateInfoViewer;
private JTabbedPane tpViewers;
/**
* Constructs a new {@code HistoryBrowser}.
*/
public HistoryBrowser() {
model = new HistoryBrowserModel();
build();
}
/**
* Constructs a new {@code HistoryBrowser}.
* @param history the history of an {@link OsmPrimitive}
*/
public HistoryBrowser(History history) {
this();
populate(history);
}
/**
* creates the table which shows the list of versions
*
* @return the panel with the version table
*/
protected JPanel createVersionTablePanel() {
JPanel pnl = new JPanel(new BorderLayout());
pnl.add(new JScrollPane(new VersionTable(model)), BorderLayout.CENTER);
return pnl;
}
/**
* creates the panel which shows information about two different versions
* of the same {@link OsmPrimitive}.
*
* @return the panel
*/
protected JPanel createVersionComparePanel() {
tpViewers = new JTabbedPane();
// create the viewers, but don't add them yet.
// see populate()
//
tagInfoViewer = new TagInfoViewer(model);
nodeListViewer = new NodeListViewer(model);
relationMemberListViewer = new RelationMemberListViewer(model);
coordinateInfoViewer = new CoordinateInfoViewer(model);
JPanel pnl = new JPanel(new BorderLayout());
pnl.add(tpViewers, BorderLayout.CENTER);
tpViewers.addChangeListener(e -> {
if (tpViewers.getSelectedComponent() == coordinateInfoViewer) {
// while building the component size is not yet known, thus panning does not give reasonable results
coordinateInfoViewer.setDisplayToFitMapMarkers();
}
});
return pnl;
}
/**
* builds the GUI
*/
protected void build() {
JPanel left = createVersionTablePanel();
JPanel right = createVersionComparePanel();
setLayout(new BorderLayout());
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);
add(pane, BorderLayout.CENTER);
pane.setOneTouchExpandable(true);
pane.setDividerLocation(300);
Dimension minimumSize = new Dimension(100, 50);
left.setMinimumSize(minimumSize);
right.setMinimumSize(minimumSize);
}
/**
* populates the browser with the history of a specific {@link OsmPrimitive}
*
* @param history the history
*/
public void populate(History history) {
model.setHistory(history);
tpViewers.removeAll();
tpViewers.add(tagInfoViewer);
tpViewers.setTitleAt(0, tr("Tags"));
if (history.getEarliest().getType().equals(OsmPrimitiveType.NODE)) {
tpViewers.add(coordinateInfoViewer);
tpViewers.setTitleAt(1, tr("Coordinates"));
} else if (history.getEarliest().getType().equals(OsmPrimitiveType.WAY)) {
tpViewers.add(nodeListViewer);
tpViewers.setTitleAt(1, tr("Nodes"));
} else if (history.getEarliest().getType().equals(OsmPrimitiveType.RELATION)) {
tpViewers.add(relationMemberListViewer);
tpViewers.setTitleAt(1, tr("Members"));
}
revalidate();
}
/**
* replies the {@link History} currently displayed by this browser
*
* @return the current history
*/
public History getHistory() {
return model.getHistory();
}
/**
* replies the model used by this browser
* @return the model
*/
public HistoryBrowserModel getModel() {
return model;
}
}