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