/* * 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.ArrayList; import java.util.Collections; import java.util.List; 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.Page; import org.wikipediacleaner.api.data.PageElementInternalLink; import org.wikipediacleaner.gui.swing.basic.Utilities; import org.wikipediacleaner.i18n.GT; /** * An action listener for checking language links existence. */ @SuppressWarnings("serial") public class CheckLanguageLinkAction extends TextAction { private final EnumWikipedia fromWiki; private final EnumWikipedia toWiki; private final String title; private final String text; private final Element element; private final JTextPane textPane; /** * @param fromWiki Wiki on which to check the language link existence. * @param toWiki Wiki to which the check has to be made. * @param title Title of the article. * @param text Text of the link. * @param element * @param textPane */ public CheckLanguageLinkAction( EnumWikipedia fromWiki, EnumWikipedia toWiki, String title, String text, Element element, JTextPane textPane) { super("CheckLanguageLink"); this.fromWiki = fromWiki; this.toWiki = toWiki; this.title = title; this.text = text; 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 { API api = APIFactory.getAPI(); StringBuilder message = new StringBuilder(); List<String> values = new ArrayList<String>(); // Check language link if ((fromWiki != null) && (toWiki != null)) { String languageLink = api.getLanguageLink(fromWiki, toWiki, title); if (message.length() > 0) { message.append("\n"); } if (languageLink != null) { message.append(GT._( "The page {0} in \"{1}\" has a language link to \"{2}\": {3}.", new Object[] { title, fromWiki.toString(), toWiki.toString(), languageLink } )); String value = PageElementInternalLink.createInternalLink(languageLink, text); if (!values.contains(value)) { values.add(value); } value = PageElementInternalLink.createInternalLink(languageLink, null); if (!values.contains(value)) { values.add(value); } value = PageElementInternalLink.createInternalLink(languageLink, title); if (!values.contains(value)) { values.add(value); } } else { message.append(GT._( "The page {0} in \"{1}\" doesn''t have a language link to \"{2}\".", new Object[] { title, fromWiki.toString(), toWiki.toString() } )); } } // Check local page if (toWiki != null) { Page page = DataManager.getPage(toWiki, title, null, null, null); api.retrieveInfo(toWiki, Collections.singletonList(page)); if (message.length() > 0) { message.append("\n"); } if (Boolean.FALSE.equals(page.isExisting())) { message.append(GT._( "The page {0} doesn''t exist in \"{1}\".", new Object[] { title, toWiki.toString() } )); } else { message.append(GT._( "The page {0} exists in \"{1}\".", new Object[] { title, toWiki.toString() } )); String value = PageElementInternalLink.createInternalLink(title, text); if (!values.contains(value)) { values.add(value); } value = PageElementInternalLink.createInternalLink(title, null); if (!values.contains(value)) { values.add(value); } } } // Ask user if (values.isEmpty()) { Utilities.displayInformationMessage( textPane.getParent(), message.toString()); } else { message.append("\n"); message.append(GT._("What replacement do you want to use?")); Object result = Utilities.askForValue( textPane.getParent(), message.toString(), values.toArray(), values.get(0)); if (result != null) { int startOffset = element.getStartOffset(); int endOffset = element.getEndOffset(); try { textPane.getDocument().remove(startOffset, endOffset - startOffset); textPane.getDocument().insertString(startOffset, result.toString(), element.getAttributes()); textPane.setCaretPosition(startOffset); textPane.moveCaretPosition(startOffset + result.toString().length()); } catch (BadLocationException e1) { // Nothing to be done } } } } catch (APIException e1) { // } } }