/* * 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.awt.event.ActionListener; import java.util.Collection; import javax.swing.JOptionPane; import org.wikipediacleaner.api.data.LinkReplacement; import org.wikipediacleaner.api.data.Page; import org.wikipediacleaner.api.data.PageAnalysis; import org.wikipediacleaner.api.data.PageElementInternalLink; import org.wikipediacleaner.gui.swing.basic.Utilities; import org.wikipediacleaner.gui.swing.component.MWPane; import org.wikipediacleaner.i18n.GT; /** * An action listener for replacing all internal links. */ public class ReplaceAllLinksAction implements ActionListener { private final MWPane textPane; private final Page from; private final String to; private final String warning; /** * @param textPane MWPane on which the edition has to be done. * @param from Page on which links are currently pointing to. * @param to New destination. * @param warning Potential warning message. */ public ReplaceAllLinksAction(MWPane textPane, Page from, String to, String warning) { this.textPane = textPane; this.from = from; this.to = to; this.warning = warning; } /* (non-Javadoc) * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(@SuppressWarnings("unused") ActionEvent e) { if ((warning != null) && (warning.trim().length() > 0)) { String message = warning + "\n" + GT._("Do you want to proceed with the replacement ?"); int answer = Utilities.displayYesNoWarning(textPane.getParent(), message); if (answer != JOptionPane.YES_OPTION) { return; } } String originalText = textPane.getText(); PageAnalysis analysis = textPane.getWikiPage().getAnalysis(originalText, true); StringBuilder buffer = new StringBuilder(); int lastPosition = 0; Collection<PageElementInternalLink> links = analysis.getInternalLinks(); for (PageElementInternalLink link : links) { if (Page.areSameTitle(from.getTitle(), link.getLink())) { buffer.append(originalText.substring(lastPosition, link.getBeginIndex())); lastPosition = link.getBeginIndex(); buffer.append(PageElementInternalLink.createInternalLink(to, link.getDisplayedText())); lastPosition = link.getEndIndex(); } } if (lastPosition > 0) { buffer.append(originalText.substring(lastPosition)); textPane.changeText(buffer.toString()); } LinkReplacement.addLastReplacement(from.getTitle(), to); } }