/*
* 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.action;
import java.awt.event.ActionEvent;
import java.util.Collections;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.TextAction;
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.DataManager;
import org.wikipediacleaner.api.data.Namespace;
import org.wikipediacleaner.api.data.Page;
import org.wikipediacleaner.api.data.PageElementCategory;
import org.wikipediacleaner.gui.swing.basic.Utilities;
import org.wikipediacleaner.i18n.GT;
/**
* An action listener for checking language links existence.
*/
@SuppressWarnings("serial")
public class CheckCategoryLinkAction extends TextAction {
private final EnumWikipedia fromWikipedia;
private final EnumWikipedia toWikipedia;
private final String title;
private final String order;
private final Element element;
private final JTextPane textPane;
public CheckCategoryLinkAction(
EnumWikipedia fromWikipedia,
EnumWikipedia toWikipedia,
String title,
String order,
Element element,
JTextPane textPane) {
super("CheckLanguageLink");
this.fromWikipedia = fromWikipedia;
this.toWikipedia = toWikipedia;
this.title = title;
this.order = order;
this.element = element;
this.textPane = textPane;
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(@SuppressWarnings("unused") ActionEvent e) {
try {
Namespace categoryNamespace = toWikipedia.getWikiConfiguration().getNamespace(Namespace.CATEGORY);
String categoryName = PageElementCategory.DEFAULT_NAME;
if (categoryNamespace != null) {
if (!PageElementCategory.DEFAULT_NAME.equals(
categoryNamespace.getCanonicalTitle())) {
categoryName = categoryNamespace.getCanonicalTitle();
} else {
for (String alias : categoryNamespace.getAliases()) {
if (!PageElementCategory.DEFAULT_NAME.equals(alias)) {
categoryName = alias;
break;
}
}
}
}
API api = APIFactory.getAPI();
Page category = DataManager.getPage(toWikipedia, "Category:" + title, null, null, null);
api.retrieveContents(toWikipedia, Collections.singletonList(category), false, false);
if (category.isExisting() == null) {
Utilities.displayWarning(
textPane.getParent(),
GT._(
"Unable to find if category {0} exists in \"{1}\".",
new Object[] { title, toWikipedia.toString() }));
return;
}
if (Boolean.TRUE.equals(category.isExisting())) {
String replace = categoryName + ":" + title + ((order != null) ? "|" + order : "");
int answer = Utilities.displayYesNoWarning(
textPane.getParent(),
GT._(
"The category {0} exists in \"{1}\".\n" +
"Do you want to replace the category by [[{2}]] ?",
new Object[] { title, toWikipedia.toString(), replace }));
if (answer == JOptionPane.YES_OPTION) {
int startOffset = element.getStartOffset();
int endOffset = element.getEndOffset();
try {
textPane.getDocument().remove(startOffset, endOffset - startOffset);
textPane.getDocument().insertString(startOffset, "[[" + replace + "]]", element.getAttributes());
textPane.setCaretPosition(startOffset);
textPane.moveCaretPosition(startOffset + replace.length());
} catch (BadLocationException e1) {
// Nothing to be done
}
}
return;
}
String languageLink = api.getLanguageLink(fromWikipedia, toWikipedia, "Category:" + title);
if (languageLink == null) {
Utilities.displayInformationMessage(
textPane.getParent(),
GT._(
"The category {0} in the {1} Wikipedia doesn''t have a language link to the {2} Wikipedia.\n" +
"It doesn''t exist either in the {2} Wikipedia.",
new Object[] { title, fromWikipedia.getSettings().getCode(), toWikipedia.getSettings().getCode() } ));
return;
}
String replace = languageLink + ((order != null) ? "|" + order : "");
int answer = Utilities.displayYesNoWarning(
textPane.getParent(),
GT._(
"The category {0} doesn''t exist in the {2} Wikipedia.\n" +
"In the {1} Wikipedia, it has a language link to the {2} Wikipedia: {3}.\n" +
"Do you want to replace the category by [[{3}]] ?",
new Object[] { title, fromWikipedia.getSettings().getCode(), toWikipedia.getSettings().getCode(), replace } ));
if (answer == JOptionPane.YES_OPTION) {
int startOffset = element.getStartOffset();
int endOffset = element.getEndOffset();
try {
textPane.getDocument().remove(startOffset, endOffset - startOffset);
textPane.getDocument().insertString(startOffset, "[[" + replace + "]]", element.getAttributes());
textPane.setCaretPosition(startOffset);
textPane.moveCaretPosition(startOffset + languageLink.length() + 4);
} catch (BadLocationException e1) {
// Nothing to be done
}
}
} catch (APIException e1) {
//
}
}
}