/*
* 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.component;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.font.TextAttribute;
import java.util.HashMap;
import java.util.Properties;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.border.EmptyBorder;
import org.wikipediacleaner.api.data.InternalLinkCount;
import org.wikipediacleaner.api.data.Page;
import org.wikipediacleaner.api.data.PageAnalysis;
import org.wikipediacleaner.utils.Configuration;
/**
* A list cell renderer for Page.
*/
public class PageListCellRenderer extends JLabel implements ListCellRenderer<Page> {
private static final long serialVersionUID = 1456336109709806845L;
private PageAnalysis analysis;
private boolean showCountOccurrence;
private boolean showDisambiguation;
private boolean showMissing;
private boolean showRedirect;
private boolean showRedirectBacklinks;
private Properties pageProperties;
private final Font missingFont;
private final Font normalFont;
private final Font redirectFont;
public PageListCellRenderer() {
setOpaque(true);
setHorizontalAlignment(LEFT);
setVerticalAlignment(CENTER);
setBorder(new EmptyBorder(0, 3, 0, 3));
HashMap<TextAttribute, Boolean> missingAttributes = new HashMap<TextAttribute, Boolean>();
missingAttributes.put(TextAttribute.STRIKETHROUGH, Boolean.TRUE /*TextAttribute.STRIKETHROUGH_ON*/);
missingFont = getFont().deriveFont(missingAttributes);
normalFont = getFont().deriveFont(Font.PLAIN);
redirectFont = getFont().deriveFont(Font.ITALIC);
setFont(normalFont);
}
/**
* @param properties Page properties.
*/
public void setPageProperties(Properties properties) {
pageProperties = properties;
}
/**
* @param show Flag indicating if the occurrence count is shown.
*/
public void showCountOccurrence(boolean show) {
showCountOccurrence = show;
}
/**
* @param show Flag indicating if the disambiguation flag is shown.
*/
public void showDisambiguation(boolean show) {
showDisambiguation = show;
}
/**
* @param analysis Page analysis.
*/
public void setPageAnalysis(PageAnalysis analysis) {
this.analysis = analysis;
}
/**
* @param show Flag indicating if missing pages are highlighted.
*/
public void showMissing(boolean show) {
showMissing = show;
}
/**
* @param show Flag indicating if redirect pages are highlighted.
*/
public void showRedirect(boolean show) {
showRedirect = show;
}
/**
* @param show Flag indicating if numbers of pages linking to redirect pages are displayed.
*/
public void showRedirectBacklinks(boolean show) {
showRedirectBacklinks = show;
}
/* (non-Javadoc)
* @see javax.swing.ListCellRenderer#getListCellRendererComponent(
* javax.swing.JList, java.lang.Object, int, boolean, boolean)
*/
@Override
public Component getListCellRendererComponent(
JList<? extends Page> list,
Page value,
@SuppressWarnings("unused") int index,
boolean isSelected,
@SuppressWarnings("unused") boolean cellHasFocus) {
// Retrieve data
String pageName = (value != null) ? value.toString() : "";
String text = pageName;
Boolean disambiguation = null;
Boolean exist = null;
boolean redirect = false;
InternalLinkCount count = null;
if (value != null) {
Page pageElement = value;
pageName = pageElement.getTitle();
text = pageName;
disambiguation = pageElement.isDisambiguationPage();
exist = pageElement.isExisting();
count = (analysis != null) ? analysis.getLinkCount(pageElement) : null;
if (showCountOccurrence &&
(count != null) &&
(count.getTotalLinkCount() > 0)) {
text += " → " + count.getTotalLinkCount();
}
redirect = pageElement.isRedirect();
if (redirect && showRedirectBacklinks) {
Integer backlinks = pageElement.getBacklinksCountInMainNamespace();
if ((backlinks != null) && (backlinks.intValue() > 0)) {
text += " ← " + backlinks;
}
}
}
// Text
setText(text);
// Color
Color background = isSelected ? list.getSelectionBackground() : Color.WHITE;
Color foreground = isSelected ? list.getSelectionForeground() : list.getForeground();
if (showDisambiguation) {
if (disambiguation == null) {
if (!isSelected) {
foreground = Color.DARK_GRAY;
}
} else if (disambiguation.booleanValue()) {
if (count == null) {
foreground = Color.RED;
} else if ((count.getInternalLinkCount() > 0) || (count.getIncorrectTemplateCount() > 0)) {
foreground = Color.RED;
} else if ((count.getHelpNeededCount() > 0)) {
foreground = Color.ORANGE;
} else {
foreground = Color.BLUE;
}
}
} else if (pageProperties != null) {
String property = pageProperties.getProperty(pageName);
if (Configuration.VALUE_PAGE_NORMAL.equals(property)) {
foreground = Color.GREEN;
} else if (Configuration.VALUE_PAGE_HELP_NEEDED.equals(property)) {
foreground = Color.ORANGE;
}
}
setBackground(background);
setForeground(foreground);
// Font
if (showMissing && Boolean.FALSE.equals(exist)) {
setFont(missingFont);
} else if (showRedirect && redirect) {
setFont(redirectFont);
} else {
setFont(normalFont);
}
return this;
}
}