/*
* 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.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.WindowConstants;
import org.wikipediacleaner.api.API;
import org.wikipediacleaner.api.APIException;
import org.wikipediacleaner.api.APIFactory;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.data.Page;
import org.wikipediacleaner.gui.swing.basic.BasicWindow;
import org.wikipediacleaner.gui.swing.basic.BasicWorker;
import org.wikipediacleaner.gui.swing.basic.DefaultBasicWindowListener;
import org.wikipediacleaner.gui.swing.basic.Utilities;
import org.wikipediacleaner.gui.swing.component.BasicPageListPopupListener;
import org.wikipediacleaner.gui.swing.component.PageListAnalyzeListener;
import org.wikipediacleaner.gui.swing.component.PageListCellRenderer;
import org.wikipediacleaner.gui.swing.component.PageListModel;
import org.wikipediacleaner.i18n.GT;
/**
* List of templates linking to a disambiguation page window.
*/
public class TemplateListWindow extends BasicWindow {
Page page;
Page link;
JList<Page> listLinks;
PageListModel modelLinks;
/**
* Create and display a TemplateListWindow.
*
* @param page Initial page.
* @param link Link.
* @param wikipedia Wikipedia.
*/
public static void createTemplateListWindow(
final Page page,
final Page link,
final EnumWikipedia wikipedia) {
createWindow(
"TemplateListWindow",
wikipedia,
WindowConstants.DISPOSE_ON_CLOSE,
TemplateListWindow.class,
new DefaultBasicWindowListener() {
@Override
public void initializeWindow(BasicWindow window) {
if (window instanceof TemplateListWindow) {
TemplateListWindow templates = (TemplateListWindow) window;
templates.page = page;
templates.link = link;
}
}
@Override
public void displayWindow(BasicWindow window) {
if (window instanceof TemplateListWindow) {
TemplateListWindow templates = (TemplateListWindow) window;
templates.actionReload();
}
}
});
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.basic.BasicWindow#getTitle()
*/
@Override
public String getTitle() {
return GT._("Templates in {0}", link.getTitle());
}
/**
* @return Window components.
*/
@Override
protected Component createComponents() {
JPanel panel = new JPanel(new GridBagLayout());
// Initialize constraints
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.insets = new Insets(0, 0, 0, 0);
constraints.ipadx = 0;
constraints.ipady = 0;
constraints.weightx = 1;
constraints.weighty = 0;
// Label
JLabel label = Utilities.createJLabel(GT._(
"Templates used in {0}, linking to {1}",
new Object[] { page.getTitle(), link.getTitle() }));
panel.add(label, constraints);
constraints.gridy++;
// Menu
modelLinks = new PageListModel();
modelLinks.setShowDisambiguation(true);
modelLinks.setShowOther(true);
// Links
constraints.fill = GridBagConstraints.BOTH;
constraints.weighty = 1;
listLinks = new JList<Page>(modelLinks);
listLinks.setCellRenderer(new PageListCellRenderer());
listLinks.addMouseListener(new BasicPageListPopupListener(getWikipedia(), null, listLinks, this));
listLinks.addMouseListener(new PageListAnalyzeListener(getWikipedia(), null));
JScrollPane scrollLinks = new JScrollPane(listLinks);
scrollLinks.setMinimumSize(new Dimension(100, 100));
scrollLinks.setPreferredSize(new Dimension(200, 500));
scrollLinks.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
panel.add(scrollLinks, constraints);
constraints.gridy++;
return panel;
}
/**
* Action called when Reload button is pressed.
*/
void actionReload() {
new ReloadWorker(getWikipedia(), this, page, link).start();
}
/**
* Add a link.
*
* @param element Link.
*/
void addLink(Object element) {
modelLinks.addElement(element);
}
/**
* SwingWorker for reloading the page.
*/
class ReloadWorker extends BasicWorker {
private final Page page1;
private final Page link1;
private final List<Page> pages;
/**
* @param wikipedia Wikipedia.
* @param window Window.
* @param page Page.
* @param link Link.
*/
public ReloadWorker(EnumWikipedia wikipedia, BasicWindow window, Page page, Page link) {
super(wikipedia, window);
this.page1 = page;
this.link1 = link;
this.pages = new ArrayList<>();
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.utils.SwingWorker#start()
*/
@Override
public void start() {
modelLinks.setShowDisambiguation(true);
modelLinks.setShowOther(true);
super.start();
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.utils.SwingWorker#finished()
*/
@Override
public void finished() {
super.finished();
for (Page p : pages) {
addLink(p);
}
if (modelLinks.getSize() > 0) {
listLinks.setSelectedIndex(0);
}
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.utils.SwingWorker#construct()
*/
@Override
public Object construct() {
try {
setText(GT._("Retrieving MediaWiki API"));
API api = APIFactory.getAPI();
setText(GT._("Retrieving templates"));
api.retrieveTemplates(getWikipedia(), page1);
setText(GT._("Retrieving links in templates"));
api.retrieveLinks(getWikipedia(), page1.getTemplates());
setText(GT._("Displaying templates found"));
for (Page p : page1.getTemplates()) {
boolean found = false;
for (Page l : p.getLinks()) {
if (link1.getTitle().equals(l.getTitle())) {
found = true;
break;
}
}
if (found) {
pages.add(p);
}
}
} catch (APIException e) {
return e;
}
return null;
}
}
}