001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.history;
003
004import java.text.DateFormat;
005
006import javax.swing.table.AbstractTableModel;
007
008import org.openstreetmap.josm.data.osm.Changeset;
009import org.openstreetmap.josm.data.osm.User;
010import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
011import org.openstreetmap.josm.tools.Logging;
012import org.openstreetmap.josm.tools.date.DateUtils;
013
014/**
015 * The table model for the list of versions in the current history
016 * @since 11646 (extracted from HistoryBrowserModel)
017 */
018public final class VersionTableModel extends AbstractTableModel {
019
020    private final HistoryBrowserModel model;
021
022    /**
023     * Constructs a new {@code VersionTableModel}.
024     * @param model parent {@code HistoryBrowserModel}
025     */
026    public VersionTableModel(HistoryBrowserModel model) {
027        this.model = model;
028    }
029
030    @Override
031    public int getRowCount() {
032        if (model.getHistory() == null)
033            return 0;
034        int ret = model.getHistory().getNumVersions();
035        if (model.getLatest() != null) {
036            ret++;
037        }
038        return ret;
039    }
040
041    @Override
042    public Object getValueAt(int row, int column) {
043        switch (column) {
044        case VersionTableColumnModel.COL_VERSION:
045            HistoryOsmPrimitive p1 = model.getPrimitive(row);
046            if (p1 != null)
047                return Long.toString(p1.getVersion());
048            return null;
049        case VersionTableColumnModel.COL_REFERENCE:
050            return model.isReferencePointInTime(row);
051        case VersionTableColumnModel.COL_CURRENT:
052            return model.isCurrentPointInTime(row);
053        case VersionTableColumnModel.COL_DATE:
054            HistoryOsmPrimitive p3 = model.getPrimitive(row);
055            if (p3 != null && p3.getTimestamp() != null)
056                return DateUtils.formatDateTime(p3.getTimestamp(), DateFormat.SHORT, DateFormat.SHORT);
057            return null;
058        case VersionTableColumnModel.COL_USER:
059            HistoryOsmPrimitive p4 = model.getPrimitive(row);
060            if (p4 != null) {
061                User user = p4.getUser();
062                if (user != null)
063                    return user.getName();
064            }
065            return null;
066        case VersionTableColumnModel.COL_EDITOR:
067            HistoryOsmPrimitive p5 = model.getPrimitive(row);
068            if (p5 != null) {
069                Changeset cs = p5.getChangeset();
070                if (cs != null) {
071                    return cs.get("created_by");
072                }
073            }
074            return null;
075        default:
076            return null;
077        }
078    }
079
080    @Override
081    public void setValueAt(Object aValue, int row, int column) {
082        if (!((Boolean) aValue))
083            return;
084        try {
085            switch (column) {
086            case 1:
087                model.setReferencePointInTime(row);
088                break;
089            case 2:
090                model.setCurrentPointInTime(row);
091                break;
092            default:
093                return;
094            }
095        } catch (IllegalArgumentException e) {
096            Logging.error(e);
097        }
098        fireTableDataChanged();
099    }
100
101    @Override
102    public boolean isCellEditable(int row, int column) {
103        return column >= 1 && column <= 2;
104    }
105
106    @Override
107    public int getColumnCount() {
108        return 6;
109    }
110}