/*
* WPCleaner: A tool to help on Wikipedia maintenance tasks.
* Copyright (C) 2013 Nicolas Vervelle
*
* See README.txt file for licensing information.
*/
package org.wikipediacleaner.gui.swing;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumnModel;
import org.wikipediacleaner.api.data.Page;
import org.wikipediacleaner.api.data.RecentChange;
import org.wikipediacleaner.i18n.GT;
/**
* A table model for Recent Changes.
*/
public class RecentChangesTableModel extends AbstractTableModel {
/**
* Serialization.
*/
private static final long serialVersionUID = 6449639241165534424L;
/**
* Recent changes.
*/
private final List<RecentChange> recentChanges;
/**
* Format for time stamp.
*/
private final DateFormat timestampFormat;
/**
* Maximum number of changes to keep in the history.
*/
private int maxChanges;
public final static int COLUMN_RC_ID = 0;
public final static int COLUMN_FLAGS = COLUMN_RC_ID + 1;
public final static int COLUMN_TIMESTAMP = COLUMN_FLAGS + 1;
public final static int COLUMN_USER = COLUMN_TIMESTAMP + 1;
public final static int COLUMN_TITLE = COLUMN_USER + 1;
public final static int NB_COLUMNS = COLUMN_TITLE + 1;
/**
* Constructor.
*
* @param recentChanges Initial list of recent changes.
*/
public RecentChangesTableModel(List<RecentChange> recentChanges) {
super();
this.timestampFormat = new SimpleDateFormat("HH:mm:ss");
this.maxChanges = 500;
this.recentChanges = new LinkedList<RecentChange>();
if (recentChanges != null) {
this.recentChanges.addAll(recentChanges);
}
cleanUpList();
}
/**
* @return List of all recent changes.
*/
public List<RecentChange> getRecentChanges() {
List<RecentChange> result = new ArrayList<RecentChange>(recentChanges.size());
result.addAll(recentChanges);
return result;
}
/**
* Add new recent changes to the list.
*
* @param newRC New recent changes.
*/
public void addRecentChanges(List<RecentChange> newRC) {
if ((newRC != null) && (!newRC.isEmpty())) {
for (RecentChange rc : newRC) {
if (!recentChanges.contains(rc)) {
recentChanges.add(rc);
}
}
cleanUpList();
}
}
/**
* Add one recent change to the list.
*
* @param rc Recent change.
*/
public void addRecentChange(RecentChange rc) {
if (!recentChanges.contains(rc)) {
recentChanges.add(rc);
cleanUpList();
}
}
/**
* Remove all recent changes for a given title.
*
* @param title Title.
*/
public void removeRecentChanges(String title) {
Iterator<RecentChange> itRC = recentChanges.iterator();
while (itRC.hasNext()) {
RecentChange rc = itRC.next();
if (Page.areSameTitle(title, rc.getTitle())) {
itRC.remove();
}
}
cleanUpList();
}
/**
* Check if there are recent changes for a given title.
*
* @param title Title.
* @return True if there are recent changes for the title.
*/
public boolean containsRecentChange(String title) {
for (RecentChange rc : recentChanges) {
if (Page.areSameTitle(title, rc.getTitle())) {
return true;
}
}
return false;
}
/**
* Configure a column model.
*
* @param model Column model.
*/
public void configureColumnModel(TableColumnModel model) {
model.getColumn(RecentChangesTableModel.COLUMN_FLAGS).setMinWidth(40);
model.getColumn(RecentChangesTableModel.COLUMN_FLAGS).setMaxWidth(40);
model.getColumn(RecentChangesTableModel.COLUMN_RC_ID).setMinWidth(80);
model.getColumn(RecentChangesTableModel.COLUMN_RC_ID).setPreferredWidth(80);
model.getColumn(RecentChangesTableModel.COLUMN_RC_ID).setMaxWidth(100);
model.getColumn(RecentChangesTableModel.COLUMN_TIMESTAMP).setMinWidth(60);
model.getColumn(RecentChangesTableModel.COLUMN_TIMESTAMP).setMaxWidth(60);
model.getColumn(RecentChangesTableModel.COLUMN_TITLE).setMinWidth(100);
model.getColumn(RecentChangesTableModel.COLUMN_TITLE).setPreferredWidth(200);
model.getColumn(RecentChangesTableModel.COLUMN_USER).setMinWidth(100);
model.getColumn(RecentChangesTableModel.COLUMN_USER).setPreferredWidth(100);
}
/**
* Clean up list of recent changes.
*/
private void cleanUpList() {
Collections.sort(recentChanges);
while (recentChanges.size() > maxChanges) {
recentChanges.remove(recentChanges.size() - 1);
}
fireTableDataChanged();
}
/**
* @return Number of rows.
* @see javax.swing.table.TableModel#getRowCount()
*/
@Override
public int getRowCount() {
return recentChanges.size();
}
/**
* @return Number of columns.
* @see javax.swing.table.TableModel#getColumnCount()
*/
@Override
public int getColumnCount() {
return NB_COLUMNS;
}
/**
* @param rowIndex Row index.
* @param columnIndex Column index.
* @return Value at row and column.
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if ((rowIndex >= 0) && (rowIndex < recentChanges.size())) {
RecentChange rc = recentChanges.get(rowIndex);
switch (columnIndex) {
case COLUMN_FLAGS:
if (RecentChange.TYPE_LOG.equals(rc.getType())) {
if (RecentChange.LOG_TYPE_BLOCK.equals(rc.getLogType())) {
return "B";
}
if (RecentChange.LOG_TYPE_DELETE.equals(rc.getLogType())) {
return "D";
}
if (RecentChange.LOG_TYPE_MOVE.equals(rc.getLogType())) {
return "M";
}
if (RecentChange.LOG_TYPE_NEWUSERS.equals(rc.getLogType())) {
return "User";
}
if (RecentChange.LOG_TYPE_PROTECT.equals(rc.getLogType())) {
return "P";
}
if (RecentChange.LOG_TYPE_UPLOAD.equals(rc.getLogType())) {
return "Upld";
}
}
return
(rc.isNew() ? "N" : "") +
(rc.isMinor() ? "m" : "") +
(rc.isBot() ? "b" : "") +
(rc.isRedirect() ? "R" : "");
case COLUMN_RC_ID:
return rc.getId();
case COLUMN_TIMESTAMP:
synchronized (timestampFormat) {
return timestampFormat.format(rc.getTimestamp());
}
case COLUMN_TITLE:
return rc.getTitle();
case COLUMN_USER:
return rc.getUser();
}
}
return null;
}
/**
* @param column Column index.
* @return Name of column.
* @see javax.swing.table.AbstractTableModel#getColumnName(int)
*/
@Override
public String getColumnName(int column) {
switch (column) {
case COLUMN_FLAGS:
return "Nmb";
case COLUMN_RC_ID:
return GT._("Id");
case COLUMN_TIMESTAMP:
return "Time";
case COLUMN_TITLE:
return GT._("Title");
case COLUMN_USER:
return GT._("User");
}
return super.getColumnName(column);
}
/**
* @param columnIndex Column index.
* @return Class of that data in the column.
* @see javax.swing.table.AbstractTableModel#getColumnClass(int)
*/
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case COLUMN_FLAGS:
return String.class;
case COLUMN_RC_ID:
return Integer.class;
case COLUMN_TIMESTAMP:
return String.class;
case COLUMN_TITLE:
return String.class;
case COLUMN_USER:
return String.class;
}
return super.getColumnClass(columnIndex);
}
}