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 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}