/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.pepsoft.worldpainter.history; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; import org.pepsoft.worldpainter.World2; /** * * @author Pepijn Schmitz */ public class WorldHistoryTableModel implements TableModel { public WorldHistoryTableModel(World2 world) { history = world.getHistory(); filter(); } public boolean isIncludeLoadsSaves() { return includeLoadsSaves; } public void setIncludeLoadsSaves(boolean includeLoadsSaves) { this.includeLoadsSaves = includeLoadsSaves; filter(); } public boolean isIncludeExportsMerges() { return includeExportsMerges; } public void setIncludeExportsMerges(boolean includeExportsMerges) { this.includeExportsMerges = includeExportsMerges; filter(); } @Override public int getRowCount() { return filteredHistory.size(); } @Override public int getColumnCount() { return COLUMN_NAMES.length; } @Override public String getColumnName(int columnIndex) { return COLUMN_NAMES[columnIndex]; } @Override public Class<?> getColumnClass(int columnIndex) { return COLUMN_TYPES[columnIndex]; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } @Override public Object getValueAt(int rowIndex, int columnIndex) { HistoryEntry entry = filteredHistory.get(rowIndex); switch (columnIndex) { case COLUMN_DATE: return dateFormatter.format(new Date(entry.timestamp)); case COLUMN_USER: return entry.userId; case COLUMN_ACTION: return entry.getText(); default: throw new IndexOutOfBoundsException("columnIndex"); } } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { throw new UnsupportedOperationException("Not supported"); } @Override public void addTableModelListener(TableModelListener l) { listeners.add(l); } @Override public void removeTableModelListener(TableModelListener l) { listeners.remove(l); } private void filter() { filteredHistory = history.stream() .filter((entry) -> includeLoadsSaves || ((entry.key != HistoryEntry.WORLD_LOADED) && (entry.key != HistoryEntry.WORLD_SAVED))) .filter((entry) -> includeExportsMerges || ((entry.key != HistoryEntry.WORLD_EXPORTED_FULL) && (entry.key != HistoryEntry.WORLD_EXPORTED_PARTIAL) && (entry.key != HistoryEntry.WORLD_MERGED_FULL) && (entry.key != HistoryEntry.WORLD_MERGED_PARTIAL))) .collect(Collectors.toList()); TableModelEvent event = new TableModelEvent(this); for (TableModelListener listener: listeners) { listener.tableChanged(event); } } private final List<HistoryEntry> history; private final List<TableModelListener> listeners = new ArrayList<>(); private final DateFormat dateFormatter = DateFormat.getDateInstance(); private List<HistoryEntry> filteredHistory; private boolean includeLoadsSaves, includeExportsMerges = true; private static final String[] COLUMN_NAMES = {"Date", "User", "Action"}; private static final Class[] COLUMN_TYPES = {String.class, String.class, String.class}; private static final int COLUMN_DATE = 0; private static final int COLUMN_USER = 1; private static final int COLUMN_ACTION = 2; }