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}