/*
* 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.pagelist;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.data.Page;
import org.wikipediacleaner.api.data.ProgressionValue;
import org.wikipediacleaner.gui.swing.component.BooleanIconCellRenderer;
import org.wikipediacleaner.gui.swing.component.IconCellRenderer;
import org.wikipediacleaner.i18n.GT;
import org.wikipediacleaner.utils.Configuration;
/**
* A table model for a list of pages.
*/
public class PageListTableModel extends AbstractTableModel {
private static final long serialVersionUID = 6219036518582006787L;
private EnumWikipedia wiki;
private List<Page> pages;
private List<String> watchedPages;
public final static int COLUMN_WATCHED = 0;
public final static int COLUMN_PAGE = COLUMN_WATCHED + 1;
public final static int COLUMN_DISAMBIGUATION = COLUMN_PAGE + 1;
public final static int COLUMN_REDIRECT = COLUMN_DISAMBIGUATION + 1;
public final static int COLUMN_BACKLINKS_MAIN = COLUMN_REDIRECT + 1;
public final static int COLUMN_BACKLINKS_TEMPLATE = COLUMN_BACKLINKS_MAIN + 1;
public final static int COLUMN_BACKLINKS_OTHER = COLUMN_BACKLINKS_TEMPLATE + 1;
public final static int COLUMN_COMMENTS_TEXT = COLUMN_BACKLINKS_OTHER + 1;
public final static int NB_COLUMNS = COLUMN_COMMENTS_TEXT + 1;
public PageListTableModel(EnumWikipedia wiki, List<Page> pages) {
this.wiki = wiki;
this.pages = pages;
updateWatchedPages();
}
/**
* Configure a column model.
*
* @param model Column model.
*/
public void configureColumnModel(TableColumnModel model) {
TableColumn column;
column = model.getColumn(COLUMN_BACKLINKS_MAIN);
column.setMinWidth(50);
column.setPreferredWidth(50);
column.setMaxWidth(100);
column = model.getColumn(COLUMN_BACKLINKS_OTHER);
column.setMinWidth(50);
column.setPreferredWidth(50);
column.setMaxWidth(100);
column = model.getColumn(COLUMN_BACKLINKS_TEMPLATE);
column.setMinWidth(40);
column.setPreferredWidth(40);
column.setMaxWidth(100);
column = model.getColumn(COLUMN_COMMENTS_TEXT);
column.setMinWidth(60);
column = model.getColumn(COLUMN_DISAMBIGUATION);
column.setMinWidth(20);
column.setPreferredWidth(20);
column.setMaxWidth(20);
column.setCellRenderer(
new BooleanIconCellRenderer("commons-disambig-colour.png", null));
column.setHeaderRenderer(
new IconCellRenderer("commons-disambig-colour.png"));
column = model.getColumn(COLUMN_REDIRECT);
column.setMinWidth(20);
column.setPreferredWidth(20);
column.setMaxWidth(20);
column.setCellRenderer(
new BooleanIconCellRenderer("commons-redirect-arrow-without-text.png", null));
column.setHeaderRenderer(
new IconCellRenderer("commons-redirect-arrow-without-text.png"));
column = model.getColumn(COLUMN_PAGE);
column.setMinWidth(100);
column.setPreferredWidth(200);
column = model.getColumn(COLUMN_WATCHED);
column.setMinWidth(20);
column.setPreferredWidth(20);
column.setMaxWidth(20);
column.setCellRenderer(
new BooleanIconCellRenderer("gnome-logviewer.png", null));
column.setHeaderRenderer(
new IconCellRenderer("gnome-logviewer.png"));
}
public void updateWatchedPages() {
Configuration config = Configuration.getConfiguration();
watchedPages = config.getStringList(wiki, Configuration.ARRAY_WATCH_PAGES);
}
/**
* @param rows Rows numbers.
* @return Corresponding pages.
*/
public List<Page> getPages(int[] rows) {
if ((rows != null) && (rows.length > 0)) {
List<Page> result = new ArrayList<Page>();
for (int i = 0; i < rows.length; i++) {
result.add(pages.get(rows[i]));
}
return result;
}
return null;
}
/**
* @return List of pages.
*/
public List<Page> getPages() {
return pages;
}
/**
* @param row Row number.
* @return Page.
*/
public Page getPage(int row) {
if ((row < 0) || (row >= pages.size())) {
return null;
}
return pages.get(row);
}
/**
* @param pageList List of pages to remove.
*/
public void removePages(Collection<Page> pageList) {
for (Page page : pageList) {
pages.remove(page);
}
fireTableDataChanged();
}
/**
* @param page Page to add.
*/
public void addPage(Page page) {
pages.add(page);
Collections.sort(pages);
fireTableDataChanged();
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnCount()
*/
@Override
public int getColumnCount() {
return NB_COLUMNS;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getRowCount()
*/
@Override
public int getRowCount() {
return (pages != null) ? pages.size() : 0;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if ((pages != null) && (rowIndex >= 0) && (rowIndex < pages.size())) {
Page page = pages.get(rowIndex);
switch (columnIndex) {
case COLUMN_BACKLINKS_MAIN:
return page.getBacklinksProgressionInMainNamespace();
case COLUMN_BACKLINKS_TEMPLATE:
return page.getBacklinksProgressionInTemplateNamespace();
case COLUMN_BACKLINKS_OTHER:
return page.getBacklinksProgressionInOtherNamespaces();
case COLUMN_COMMENTS_TEXT:
if (page.getComment() != null) {
return page.getComment().getComment();
}
return null;
case COLUMN_DISAMBIGUATION:
return page.isDisambiguationPage();
case COLUMN_PAGE:
return page.getTitle();
case COLUMN_REDIRECT:
return page.isRedirect();
case COLUMN_WATCHED:
return watchedPages.contains(page.getTitle());
}
}
return null;
}
/* (non-Javadoc)
* @see javax.swing.table.AbstractTableModel#getColumnName(int)
*/
@Override
public String getColumnName(int column) {
switch (column) {
case COLUMN_BACKLINKS_MAIN:
return GT._("Main");
case COLUMN_BACKLINKS_TEMPLATE:
return "{{.}}";
case COLUMN_BACKLINKS_OTHER:
return GT._("Other");
case COLUMN_COMMENTS_TEXT:
return GT._("Comments");
case COLUMN_DISAMBIGUATION:
return "D";
case COLUMN_PAGE:
return GT._("Page");
case COLUMN_REDIRECT:
return "R";
case COLUMN_WATCHED:
return "";
}
return super.getColumnName(column);
}
/* (non-Javadoc)
* @see javax.swing.table.AbstractTableModel#getColumnClass(int)
*/
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case COLUMN_BACKLINKS_MAIN:
return ProgressionValue.class;
case COLUMN_BACKLINKS_TEMPLATE:
return ProgressionValue.class;
case COLUMN_BACKLINKS_OTHER:
return ProgressionValue.class;
case COLUMN_COMMENTS_TEXT:
return String.class;
case COLUMN_DISAMBIGUATION:
return Boolean.class;
case COLUMN_PAGE:
return String.class;
case COLUMN_REDIRECT:
return Boolean.class;
case COLUMN_WATCHED:
return Boolean.class;
}
return super.getColumnClass(columnIndex);
}
}