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