/*
* 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.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.beans.EventHandler;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.wikipediacleaner.Version;
import org.wikipediacleaner.api.API;
import org.wikipediacleaner.api.APIException;
import org.wikipediacleaner.api.APIFactory;
import org.wikipediacleaner.api.constants.EnumLanguage;
import org.wikipediacleaner.api.constants.EnumQueryPage;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.constants.WPCConfiguration;
import org.wikipediacleaner.api.constants.WPCConfigurationString;
import org.wikipediacleaner.api.constants.WPCConfigurationStringList;
import org.wikipediacleaner.api.data.AbuseFilter;
import org.wikipediacleaner.api.data.DataManager;
import org.wikipediacleaner.api.data.Namespace;
import org.wikipediacleaner.api.data.Page;
import org.wikipediacleaner.api.data.PageAnalysis;
import org.wikipediacleaner.api.data.PageElementInternalLink;
import org.wikipediacleaner.api.data.Suggestion;
import org.wikipediacleaner.gui.swing.action.ActionDisambiguationAnalysis;
import org.wikipediacleaner.gui.swing.action.ActionFullAnalysis;
import org.wikipediacleaner.gui.swing.action.ActionUpdateWarning;
import org.wikipediacleaner.gui.swing.action.ActionUtilities;
import org.wikipediacleaner.gui.swing.basic.BasicWindow;
import org.wikipediacleaner.gui.swing.basic.BasicWindowListener;
import org.wikipediacleaner.gui.swing.basic.BasicWorker;
import org.wikipediacleaner.gui.swing.basic.BasicWorkerListener;
import org.wikipediacleaner.gui.swing.basic.Utilities;
import org.wikipediacleaner.gui.swing.component.HTMLPane;
import org.wikipediacleaner.gui.swing.pagelist.PageListWorker;
import org.wikipediacleaner.gui.swing.worker.LoginWorker;
import org.wikipediacleaner.gui.swing.worker.RandomPageWorker;
import org.wikipediacleaner.i18n.GT;
import org.wikipediacleaner.images.EnumImageSize;
import org.wikipediacleaner.utils.Configuration;
import org.wikipediacleaner.utils.ConfigurationConstants;
import org.wikipediacleaner.utils.ConfigurationValueBoolean;
import org.wikipediacleaner.utils.ConfigurationValueInteger;
import org.wikipediacleaner.utils.ConfigurationValueShortcut;
import org.wikipediacleaner.utils.ConfigurationValueString;
import org.wikipediacleaner.utils.StringChecker;
/**
* Main Window of WikipediaCleaner.
*/
public class MainWindow
extends BasicWindow
implements ActionListener {
public final static Integer WINDOW_VERSION = Integer.valueOf(6);
private final static String URL_OTHER_LANGUAGE = "http://en.wikipedia.org/wiki/Wikipedia:WPCleaner/Languages";
private final static String URL_OTHER_WIKIPEDIA = "http://en.wikipedia.org/wiki/Wikipedia:WPCleaner/Wikis";
private final static String URL_TALK_PAGE = "http://fr.wikipedia.org/wiki/Discussion_Wikipédia:WPCleaner";
JComboBox<EnumWikipedia> comboWikipedia;
private JComboBox<EnumLanguage> comboLanguage;
JComboBox<Object> comboUser;
JPasswordField textPassword;
private char echoPassword = '*';
private ButtonGroup groupSaveUsernamePassword;
private JRadioButton radSavePassword;
private JRadioButton radSaveUsername;
private JRadioButton radSaveNothing;
private JButton buttonLogin;
private JButton buttonDemo;
private JButton buttonLogout;
private JButton buttonDisconnect;
private JButton buttonHelp;
private JButton buttonAbuseFilters;
private JButton buttonAllDab;
private JButton buttonBotTools;
private JButton buttonCheckWiki;
private JButton buttonCurrentDabList;
private JButton buttonGenerateLists;
private JButton buttonHelpRequested;
private JButton buttonMostDabLinks;
private JButton buttonRandomPages;
private JButton buttonSpecialLists;
private JButton buttonWatchlistLocal;
private JButton buttonWatchlist;
private JComboBox<String> comboPagename;
private JButton buttonFullAnalysis;
private JButton buttonDisambiguation;
private JButton buttonSearchTitles;
private JButton buttonBackLinks;
private JButton buttonEmbeddedIn;
private JButton buttonInternalLinks;
private JButton buttonCategoryMembers;
private JButton buttonUpdateWarning;
private JButton buttonAddPage;
private JButton buttonRemovePage;
private JButton buttonRandomPage;
private JButton buttonLoadList;
private JButton buttonContributions;
private JButton buttonOptions;
private JButton buttonOptionsSystem;
private JButton buttonReloadOptions;
private JButton buttonCheckSpelling;
private JButton buttonIdea;
private JButton buttonAbout;
boolean logged = false;
boolean userLogged = false;
private static class MainWindowListener implements BasicWindowListener {
private final EnumWikipedia wiki;
private final String userName;
private final String password;
public MainWindowListener(EnumWikipedia wiki, String userName, String password) {
this.wiki = wiki;
this.userName = userName;
this.password = password;
}
/**
* Called just after BasicWindow constructor has been called.
*
* @param window BasicWindow.
* @see org.wikipediacleaner.gui.swing.basic.BasicWindowListener#initializeWindow(org.wikipediacleaner.gui.swing.basic.BasicWindow)
*/
@Override
public void initializeWindow(BasicWindow window) {
// Nothing to do
}
/**
* Called just after BasicWindow has been displayed.
*
* @param window BasicWindow.
* @see org.wikipediacleaner.gui.swing.basic.BasicWindowListener#displayWindow(org.wikipediacleaner.gui.swing.basic.BasicWindow)
*/
@Override
public void displayWindow(BasicWindow window) {
Configuration config = Configuration.getConfiguration();
config.checkVersion(window.getParentComponent());
MainWindow mainWindow = (MainWindow) window;
if (wiki != null) {
mainWindow.comboWikipedia.setSelectedItem(wiki);
}
if (userName != null) {
mainWindow.comboUser.setSelectedItem(userName);
}
if (password != null) {
mainWindow.textPassword.setText(password);
}
if ((wiki != null) && (userName != null) && (password != null)) {
mainWindow.actionLogin();
}
}
}
/**
* Create and display a MainWindow.
*/
public static void createMainWindow(EnumWikipedia wiki, String userName, String password) {
createWindow(
"MainWindow",
null,
JFrame.EXIT_ON_CLOSE,
MainWindow.class,
new MainWindowListener(wiki, userName, password));
}
/**
* @return Window title.
* @see org.wikipediacleaner.gui.swing.basic.BasicWindow#getTitle()
*/
@Override
public String getTitle() {
return GT._(
"{0} - Version {1} ({2})",
new Object[] { Version.PROGRAM, Version.VERSION, DateFormat.getDateInstance().format(Version.DATE) });
}
/**
* @return Window components.
*/
@Override
protected Component createComponents() {
JPanel panel = new JPanel(new GridBagLayout());
// Initialize constraints
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
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 = 1;
// Main components
constraints.gridwidth = 1;
constraints.gridx = 0;
constraints.weighty = 1;
panel.add(createLoginComponents(), constraints);
constraints.gridx++;
panel.add(createProjectsComponents(), constraints);
constraints.gridx++;
panel.add(createPageComponents(), constraints);
constraints.gridy++;
// Message components
if ((Version.MESSAGE != null) && !Version.MESSAGE.equals("")) {
try {
Component messageComponents = createMessageComponents();
constraints.gridwidth = 3;
constraints.gridx = 0;
constraints.weighty = 0;
panel.add(messageComponents, constraints);
constraints.gridy++;
} catch (Throwable t) {
logError("Unable to create message components", t);
}
}
updateComponentState();
return panel;
}
/**
* Update component state.
*/
@Override
protected void updateComponentState() {
comboWikipedia.setEnabled(!logged);
comboLanguage.setEnabled(!logged);
comboUser.setEnabled(!logged);
textPassword.setEnabled(!logged);
textPassword.setEchoChar(logged ? ' ' : echoPassword);
buttonLogin.setEnabled(!logged);
buttonDemo.setEnabled(!logged);
buttonLogout.setEnabled(logged);
buttonDisconnect.setEnabled(logged);
buttonOptionsSystem.setEnabled(logged);
buttonReloadOptions.setEnabled(logged);
buttonCheckSpelling.setEnabled(logged);
buttonAbuseFilters.setEnabled(logged);
buttonAllDab.setEnabled(logged);
buttonBotTools.setEnabled(userLogged);
buttonCheckWiki.setEnabled(logged);
buttonCurrentDabList.setEnabled(logged);
buttonGenerateLists.setEnabled(logged);
buttonHelpRequested.setEnabled(logged);
buttonMostDabLinks.setEnabled(logged);
buttonRandomPages.setEnabled(logged);
buttonSpecialLists.setEnabled(logged);
buttonWatchlistLocal.setEnabled(logged);
buttonWatchlist.setEnabled(logged);
comboPagename.setEnabled(logged);
buttonFullAnalysis.setEnabled(logged);
buttonDisambiguation.setEnabled(logged);
buttonSearchTitles.setEnabled(logged);
buttonInternalLinks.setEnabled(logged);
buttonBackLinks.setEnabled(logged);
buttonCategoryMembers.setEnabled(logged);
buttonEmbeddedIn.setEnabled(logged);
buttonUpdateWarning.setEnabled(logged);
buttonRandomPage.setEnabled(logged);
buttonAddPage.setEnabled(logged);
buttonRemovePage.setEnabled(logged);
buttonLoadList.setEnabled(logged);
buttonContributions.setEnabled(logged);
}
/**
* @return Message components.
*/
private Component createMessageComponents() {
JPanel panel = new JPanel(new GridLayout(1, 0));
panel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(
Version.HIGHLIGHT ? Color.RED : null,
Version.HIGHLIGHT ? Color.RED : null),
GT._("Message"),
TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION));
if (Version.HIGHLIGHT) {
panel.setBackground(Color.RED);
}
HTMLPane textMessage = HTMLPane.createHTMLPane(Version.MESSAGE);
JScrollPane scrollMessage = new JScrollPane(textMessage);
scrollMessage.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
panel.add(scrollMessage);
return panel;
}
/**
* @return Login components.
*/
private Component createLoginComponents() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), GT._("Login")));
Configuration configuration = Configuration.getConfiguration();
// 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(1, 1, 1, 1);
constraints.ipadx = 0;
constraints.ipady = 0;
constraints.weightx = 0;
constraints.weighty = 0;
// Wikipedia
EnumWikipedia defaultWikipedia = configuration.getWikipedia();
comboWikipedia = new JComboBox<EnumWikipedia>(EnumWikipedia.getList().toArray(new EnumWikipedia[0]));
comboWikipedia.setEditable(false);
comboWikipedia.setSelectedItem(defaultWikipedia);
comboWikipedia.addItemListener(EventHandler.create(
ItemListener.class, this, "actionChangeWiki"));
JLabel labelWikipedia = Utilities.createJLabel(GT._("Wiki"));
labelWikipedia.setLabelFor(comboWikipedia);
labelWikipedia.setHorizontalAlignment(SwingConstants.TRAILING);
JToolBar toolbarWikipedia = new JToolBar(SwingConstants.HORIZONTAL);
toolbarWikipedia.setFloatable(false);
toolbarWikipedia.setBorderPainted(false);
JButton buttonWikipediaInfo = Utilities.createJButton(
"tango-help-browser.png", EnumImageSize.SMALL,
GT._("Other Wikipedia"), false, null);
buttonWikipediaInfo.addActionListener(EventHandler.create(
ActionListener.class, this, "actionOtherWikipedia"));
toolbarWikipedia.add(buttonWikipediaInfo);
constraints.gridx = 0;
constraints.weightx = 0;
panel.add(labelWikipedia, constraints);
constraints.gridx = 1;
constraints.weightx = 1;
panel.add(comboWikipedia, constraints);
constraints.gridx = 2;
constraints.weightx = 0;
panel.add(toolbarWikipedia, constraints);
constraints.gridy++;
// Language
comboLanguage = new JComboBox<EnumLanguage>(EnumLanguage.getList().toArray(new EnumLanguage[0]));
comboLanguage.setEditable(false);
comboLanguage.setSelectedItem(configuration.getLanguage());
comboLanguage.addItemListener(EventHandler.create(
ItemListener.class, this, "actionChangeLanguage"));
JLabel labelLanguage = Utilities.createJLabel(GT._("Language"));
labelLanguage.setLabelFor(comboLanguage);
labelLanguage.setHorizontalAlignment(SwingConstants.TRAILING);
JToolBar toolbarLanguage = new JToolBar(SwingConstants.HORIZONTAL);
toolbarLanguage.setFloatable(false);
toolbarLanguage.setBorderPainted(false);
JButton buttonLanguageInfo = Utilities.createJButton(
"tango-help-browser.png", EnumImageSize.SMALL,
GT._("Other Language"), false, null);
buttonLanguageInfo.addActionListener(EventHandler.create(
ActionListener.class, this, "actionOtherLanguage"));
toolbarLanguage.add(buttonLanguageInfo);
constraints.gridx = 0;
constraints.weightx = 0;
panel.add(labelLanguage, constraints);
constraints.gridx = 1;
constraints.weightx = 1;
panel.add(comboLanguage, constraints);
constraints.gridx = 2;
constraints.weightx = 0;
panel.add(toolbarLanguage, constraints);
constraints.gridy++;
// User name
comboUser = new JComboBox<Object>();
comboUser.setEditable(true);
comboUser.addItemListener(EventHandler.create(
ItemListener.class, this, "actionChangeUser"));
JLabel labelUsername = Utilities.createJLabel(GT._("Username:"));
labelUsername.setLabelFor(comboUser);
labelUsername.setHorizontalAlignment(SwingConstants.TRAILING);
constraints.gridx = 0;
constraints.weightx = 0;
panel.add(labelUsername, constraints);
constraints.gridx = 1;
constraints.weightx = 1;
panel.add(comboUser, constraints);
constraints.gridy++;
// Password
textPassword = new JPasswordField();
textPassword.setText("");
echoPassword = textPassword.getEchoChar();
JLabel labelPassword = Utilities.createJLabel(GT._("Password :"));
labelPassword.setLabelFor(textPassword);
labelPassword.setHorizontalAlignment(SwingConstants.TRAILING);
constraints.gridx = 0;
constraints.weightx = 0;
panel.add(labelPassword, constraints);
constraints.gridx = 1;
constraints.weightx = 1;
panel.add(textPassword, constraints);
constraints.gridy++;
// Login/Demo/Logout buttons
JToolBar buttonToolbar = new JToolBar(SwingConstants.HORIZONTAL);
buttonToolbar.setFloatable(false);
buttonToolbar.setBorderPainted(false);
buttonLogin = Utilities.createJButton(
GT._("Login"),
ConfigurationValueShortcut.LOGIN);
buttonLogin.addActionListener(EventHandler.create(
ActionListener.class, this, "actionLogin"));
buttonToolbar.add(buttonLogin);
buttonToolbar.addSeparator();
buttonDemo = Utilities.createJButton(GT._("Demo"), null);
buttonDemo.addActionListener(EventHandler.create(
ActionListener.class, this, "actionDemo"));
buttonToolbar.add(buttonDemo);
buttonToolbar.addSeparator();
buttonLogout = Utilities.createJButton(
GT._("Wiki logout"),
ConfigurationValueShortcut.LOGOUT);
buttonLogout.addActionListener(EventHandler.create(
ActionListener.class, this, "actionLogout"));
buttonToolbar.add(buttonLogout);
buttonToolbar.addSeparator();
buttonDisconnect = Utilities.createJButton(
GT._("WPC logout"), null);
buttonDisconnect.addActionListener(EventHandler.create(
ActionListener.class, this, "actionDisconnect"));
buttonToolbar.add(buttonDisconnect);
constraints.fill = GridBagConstraints.NONE;
constraints.gridwidth = 2;
constraints.gridx = 0;
constraints.weightx = 1;
panel.add(buttonToolbar, constraints);
constraints.gridy++;
// Buttons
buttonToolbar = new JToolBar(SwingConstants.HORIZONTAL);
buttonToolbar.setFloatable(false);
buttonToolbar.setBorderPainted(false);
buttonHelp = Utilities.createJButton(
"tango-help-browser.png", EnumImageSize.NORMAL,
GT._("Help"), false,
ConfigurationValueShortcut.HELP);
buttonHelp.addActionListener(EventHandler.create(
ActionListener.class, this, "actionHelp"));
buttonToolbar.add(buttonHelp);
buttonOptions = Utilities.createJButton(
"gnome-preferences-other.png", EnumImageSize.NORMAL,
GT._("Options"), false,
ConfigurationValueShortcut.OPTIONS);
buttonOptions.addActionListener(EventHandler.create(
ActionListener.class, this, "actionOptions"));
buttonToolbar.add(buttonOptions);
buttonOptionsSystem = Utilities.createJButton(
"gnome-preferences-system.png", EnumImageSize.NORMAL,
GT._("System options"), false,
ConfigurationValueShortcut.SYSTEM_OPTIONS);
buttonOptionsSystem.addActionListener(EventHandler.create(
ActionListener.class, this, "actionOptionsSystem"));
buttonToolbar.add(buttonOptionsSystem);
buttonReloadOptions = Utilities.createJButton(
"gnome-view-refresh.png", EnumImageSize.NORMAL,
GT._("Reload system options"), false, null);
buttonReloadOptions.addActionListener(EventHandler.create(
ActionListener.class, this, "actionReloadOptions"));
buttonToolbar.add(buttonReloadOptions);
buttonCheckSpelling = Utilities.createJButton(
"gnome-tools-check-spelling.png", EnumImageSize.NORMAL,
GT._("Check spelling options"), false, null);
buttonCheckSpelling.addActionListener(EventHandler.create(
ActionListener.class, this, "actionCheckSpelling"));
buttonToolbar.add(buttonCheckSpelling);
buttonToolbar.addSeparator();
buttonIdea = Utilities.createJButton(
GT._("Idea? Bug?"),
ConfigurationValueShortcut.BUG_REPORT);
buttonIdea.addActionListener(EventHandler.create(
ActionListener.class, this, "actionIdea"));
buttonToolbar.add(buttonIdea);
buttonToolbar.addSeparator();
buttonAbout = Utilities.createJButton(GT._("About"), null);
buttonAbout.addActionListener(EventHandler.create(
ActionListener.class, this, "actionAbout"));
buttonToolbar.add(buttonAbout);
constraints.fill = GridBagConstraints.NONE;
constraints.weighty = 0;
panel.add(buttonToolbar, constraints);
constraints.gridy++;
// Save password
int saveUser = configuration.getInt(
null, ConfigurationValueInteger.SAVE_USER);
groupSaveUsernamePassword = new ButtonGroup();
radSavePassword = Utilities.createJRadioButton(
GT._("Save username and password"),
(saveUser == ConfigurationConstants.VALUE_SAVE_USER_BOTH));
radSavePassword.addActionListener(EventHandler.create(
ActionListener.class, this, "actionSavePassword"));
groupSaveUsernamePassword.add(radSavePassword);
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 0;
constraints.weightx = 0;
constraints.gridwidth = 2;
panel.add(radSavePassword, constraints);
constraints.gridy++;
radSaveUsername = Utilities.createJRadioButton(
GT._("Save username only"),
(saveUser == ConfigurationConstants.VALUE_SAVE_USER_NAME));
groupSaveUsernamePassword.add(radSaveUsername);
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 0;
constraints.weightx = 0;
constraints.gridwidth = 2;
panel.add(radSaveUsername, constraints);
constraints.gridy++;
radSaveNothing = Utilities.createJRadioButton(
GT._("Save none of them"),
(saveUser != ConfigurationConstants.VALUE_SAVE_USER_BOTH) &&
(saveUser != ConfigurationConstants.VALUE_SAVE_USER_NAME));
groupSaveUsernamePassword.add(radSaveNothing);
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 0;
constraints.weightx = 0;
constraints.gridwidth = 2;
panel.add(radSaveNothing, constraints);
constraints.gridy++;
// Empty panel
JPanel emptyPanel = new JPanel();
emptyPanel.setMinimumSize(new Dimension(0, 0));
emptyPanel.setPreferredSize(new Dimension(0, 0));
constraints.fill = GridBagConstraints.BOTH;
constraints.gridwidth = 2;
constraints.gridx = 0;
constraints.insets = new Insets(0, 0, 0, 0);
constraints.weightx = 1;
constraints.weighty = 1;
panel.add(emptyPanel, constraints);
constraints.gridy++;
actionChangeWiki();
return panel;
}
/**
* @return Page components.
*/
private Component createPageComponents() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), GT._("Page")));
Configuration configuration = Configuration.getConfiguration();
// 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, 1, 0, 1);
constraints.ipadx = 0;
constraints.ipady = 0;
constraints.weightx = 1;
constraints.weighty = 0;
// Page name
String lastPage = "";
if (configuration.getBoolean(
null,
ConfigurationValueBoolean.REMEMBER_LAST_PAGE)) {
lastPage = configuration.getString(null, ConfigurationValueString.PAGE_NAME);
}
List<String> interestingPages = configuration.getStringList(
null, Configuration.ARRAY_INTERESTING_PAGES);
if (interestingPages != null) {
comboPagename = new JComboBox<String>(interestingPages.toArray(new String[0]));
} else {
comboPagename = new JComboBox<String>();
}
comboPagename.setEditable(true);
comboPagename.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXXXXX");
comboPagename.setSelectedItem(lastPage);
panel.add(comboPagename, constraints);
constraints.gridx++;
// Random page button
JToolBar toolbarPage = new JToolBar(SwingConstants.HORIZONTAL);
toolbarPage.setFloatable(false);
toolbarPage.setBorderPainted(false);
buttonRandomPage = Utilities.createJButton(
"commons-nuvola-apps-atlantik.png", EnumImageSize.SMALL,
GT._("Random page"), false,
ConfigurationValueShortcut.RANDOM_PAGE);
buttonRandomPage.addActionListener(EventHandler.create(
ActionListener.class, this, "actionRandomPage"));
toolbarPage.add(buttonRandomPage);
buttonAddPage = Utilities.createJButton(
"gnome-list-add.png", EnumImageSize.SMALL,
GT._("Add to list"), false,
ConfigurationValueShortcut.LIST_ADD);
buttonAddPage.addActionListener(EventHandler.create(
ActionListener.class, this, "actionAddPage"));
toolbarPage.add(buttonAddPage);
buttonRemovePage = Utilities.createJButton(
"gnome-list-remove.png", EnumImageSize.SMALL,
GT._("Remove from list"), false,
ConfigurationValueShortcut.LIST_REMOVE);
buttonRemovePage.addActionListener(EventHandler.create(
ActionListener.class, this, "actionRemovePage"));
toolbarPage.add(buttonRemovePage);
constraints.weightx = 0;
panel.add(toolbarPage, constraints);
constraints.gridy++;
constraints.gridwidth = 2;
constraints.gridx = 0;
constraints.weightx = 1;
// Full analysis button
buttonFullAnalysis = ActionFullAnalysis.createButton(getWikipedia(), null, true, true, true);
panel.add(buttonFullAnalysis, constraints);
constraints.gridy++;
// Disambiguation button
buttonDisambiguation = ActionDisambiguationAnalysis.createButton(getWikipedia(), null, true, true, true);
panel.add(buttonDisambiguation, constraints);
constraints.gridy++;
// Search button
buttonSearchTitles = Utilities.createJButton(
"gnome-system-search.png", EnumImageSize.NORMAL,
GT._("Search in titles"), true, null);
buttonSearchTitles.addActionListener(EventHandler.create(
ActionListener.class, this, "actionSearchTitles"));
panel.add(buttonSearchTitles, constraints);
constraints.gridy++;
// Links button
buttonInternalLinks = Utilities.createJButton(
"wpc-internal-link.png", EnumImageSize.NORMAL,
GT._("Internal links"), true, null);
buttonInternalLinks.addActionListener(EventHandler.create(
ActionListener.class, this, "actionInternalLinks"));
panel.add(buttonInternalLinks, constraints);
constraints.gridy++;
// Backlinks
buttonBackLinks = Utilities.createJButton(
"wpc-internal-link.png", EnumImageSize.NORMAL,
GT._("What links here"), true, null);
buttonBackLinks.addActionListener(EventHandler.create(
ActionListener.class, this, "actionBackLinks"));
panel.add(buttonBackLinks, constraints);
constraints.gridy++;
// Category members
buttonCategoryMembers = Utilities.createJButton(
"commons-nuvola-apps-kpager.png", EnumImageSize.NORMAL,
GT._("Category members"), true, null);
buttonCategoryMembers.addActionListener(EventHandler.create(
ActionListener.class, this, "actionCategoryMembers"));
panel.add(buttonCategoryMembers, constraints);
constraints.gridy++;
// Embedded in
buttonEmbeddedIn = Utilities.createJButton(
"commons-curly-brackets.png", EnumImageSize.NORMAL,
GT._("Embedded in"), true, null);
buttonEmbeddedIn.addActionListener(EventHandler.create(
ActionListener.class, this, "actionEmbeddedIn"));
panel.add(buttonEmbeddedIn, constraints);
constraints.gridy++;
// Update warnings
buttonUpdateWarning = ActionUpdateWarning.createButton(
getParentComponent(), this, this, true, true);
panel.add(buttonUpdateWarning, constraints);
constraints.gridy++;
// Empty panel
JPanel emptyPanel = new JPanel();
emptyPanel.setMinimumSize(new Dimension(0, 0));
emptyPanel.setPreferredSize(new Dimension(0, 0));
constraints.fill = GridBagConstraints.BOTH;
constraints.weighty = 1;
panel.add(emptyPanel, constraints);
constraints.gridy++;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weighty = 0;
// Load list from disk
buttonLoadList = Utilities.createJButton(
"gnome-drive-harddisk.png", EnumImageSize.NORMAL,
GT._("Load list from drive"), true, null);
buttonLoadList.addActionListener(EventHandler.create(
ActionListener.class, this, "actionLoadList"));
panel.add(buttonLoadList, constraints);
constraints.gridy++;
// Contributions
buttonContributions = Utilities.createJButton(
"gnome-utilities-system-monitor.png", EnumImageSize.NORMAL,
GT._("Your contributions"), true, null);
buttonContributions.addActionListener(EventHandler.create(
ActionListener.class, this, "actionContributions"));
panel.add(buttonContributions, constraints);
constraints.gridy++;
return panel;
}
/**
* @return Projects components.
*/
private Component createProjectsComponents() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), GT._("Projects")));
// 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, 1, 0, 1);
constraints.ipadx = 0;
constraints.ipady = 0;
constraints.weightx = 1;
constraints.weighty = 0;
// All disambiguation pages button
buttonAllDab = Utilities.createJButton(
"commons-disambig-colour.png", EnumImageSize.NORMAL,
GT._("Preload disambiguations pages"), true, null);
buttonAllDab.addActionListener(EventHandler.create(
ActionListener.class, this, "actionAllDab"));
panel.add(buttonAllDab, constraints);
constraints.gridy++;
// Current disambiguation list button
buttonCurrentDabList = Utilities.createJButton(
"commons-disambig-colour.png", EnumImageSize.NORMAL,
GT._("Current disambiguation list"), true,
ConfigurationValueShortcut.CURRENT_DAB_LIST);
buttonCurrentDabList.addActionListener(EventHandler.create(
ActionListener.class, this, "actionCurrentDabList"));
panel.add(buttonCurrentDabList, constraints);
constraints.gridy++;
// Pages with most disambiguation links button
buttonMostDabLinks = Utilities.createJButton(
"commons-disambig-colour.png", EnumImageSize.NORMAL,
GT._("With many disambiguation links"), true, null);
buttonMostDabLinks.addActionListener(EventHandler.create(
ActionListener.class, this, "actionMostDabLinks"));
panel.add(buttonMostDabLinks, constraints);
constraints.gridy++;
// Check Wiki Project button
buttonCheckWiki = Utilities.createJButton(
"commons-nuvola-web-broom.png", EnumImageSize.NORMAL,
GT._("Project Check Wikipedia"), true, null);
buttonCheckWiki.addActionListener(EventHandler.create(
ActionListener.class, this, "actionCheckWiki"));
panel.add(buttonCheckWiki, constraints);
constraints.gridy++;
// Help requested button
buttonHelpRequested = Utilities.createJButton(
"gnome-dialog-question.png", EnumImageSize.NORMAL,
GT._("Help requested on..."), true, null);
buttonHelpRequested.addActionListener(EventHandler.create(
ActionListener.class, this, "actionHelpRequestedOn"));
panel.add(buttonHelpRequested, constraints);
constraints.gridy++;
// Abuse filters
buttonAbuseFilters = Utilities.createJButton(
null, EnumImageSize.NORMAL,
GT._("Abuse filters"), true, null);
buttonAbuseFilters.addActionListener(EventHandler.create(
ActionListener.class, this, "actionAbuseFilters"));
panel.add(buttonAbuseFilters, constraints);
constraints.gridy++;
// Special lists
buttonSpecialLists = Utilities.createJButton(
"gnome-colors-applications-office.png", EnumImageSize.NORMAL,
GT._("Special lists"), true, null);
buttonSpecialLists.addActionListener(EventHandler.create(
ActionListener.class, this, "actionSpecialLists"));
panel.add(buttonSpecialLists, constraints);
constraints.gridy++;
// Generate lists
buttonGenerateLists = Utilities.createJButton(
"gnome-colors-applications-office.png", EnumImageSize.NORMAL,
GT._("Generate lists"), true, null);
buttonGenerateLists.addActionListener(EventHandler.create(
ActionListener.class, this, "actionGenerateLists"));
panel.add(buttonGenerateLists, constraints);
constraints.gridy++;
// Local watch list button
buttonWatchlistLocal = Utilities.createJButton(
"gnome-logviewer.png", EnumImageSize.NORMAL,
GT._("Local Watchlist"), true,
ConfigurationValueShortcut.WATCH_LIST);
buttonWatchlistLocal.addActionListener(EventHandler.create(
ActionListener.class, this, "actionWatchlistLocal"));
panel.add(buttonWatchlistLocal, constraints);
constraints.gridy++;
// Watch list button
buttonWatchlist = Utilities.createJButton(
"gnome-logviewer.png", EnumImageSize.NORMAL,
GT._("Watchlist"), true, null);
buttonWatchlist.addActionListener(EventHandler.create(
ActionListener.class, this, "actionWatchlist"));
panel.add(buttonWatchlist, constraints);
constraints.gridy++;
// Random pages button
buttonRandomPages = Utilities.createJButton(
"commons-nuvola-apps-atlantik.png", EnumImageSize.NORMAL,
GT._("Random pages"), true, null);
buttonRandomPages.addActionListener(EventHandler.create(
ActionListener.class, this, "actionRandom"));
panel.add(buttonRandomPages, constraints);
constraints.gridy++;
// Bot tools button
buttonBotTools = Utilities.createJButton(
"commons-nuvola-apps-kcmsystem.png", EnumImageSize.NORMAL,
GT._("Bot tools"), true, null);
buttonBotTools.addActionListener(EventHandler.create(
ActionListener.class, this, "actionBotTools"));
panel.add(buttonBotTools, constraints);
constraints.gridy++;
// Empty panel
JPanel emptyPanel = new JPanel();
emptyPanel.setMinimumSize(new Dimension(0, 0));
emptyPanel.setPreferredSize(new Dimension(0, 0));
constraints.fill = GridBagConstraints.BOTH;
constraints.weighty = 1;
panel.add(emptyPanel, constraints);
constraints.gridy++;
return panel;
}
/**
* Action called when About button is pressed.
*/
public void actionAbout() {
Controller.runAbout();
}
/**
* Action called when Options button is pressed.
*/
public void actionOptions() {
Controller.runOptions();
}
/**
* Action called when Login button is pressed.
*/
public void actionLogin() {
actionLoginDemo(true);
}
/**
* Action called when Demo button is pressed.
*/
public void actionDemo() {
int answer = displayYesNoWarning(GT._(
"Demo mode is only available for testing WPCleaner.\n" +
"You won't be able to modify pages on Wikipedia in Demo mode.\n" +
"Do you want to continue ?"));
if (answer == JOptionPane.YES_OPTION) {
actionLoginDemo(false);
}
}
/**
* Action called when Other Wikipedia button is pressed.
*/
public void actionOtherWikipedia() {
String url = URL_OTHER_WIKIPEDIA;
if (Utilities.isDesktopSupported()) {
Utilities.browseURL(url);
} else {
displayUrlMessage(
GT._("You can learn how to add other Wikipedia at the following URL:"),
url);
}
}
/**
* Action called when Other Language button is pressed.
*/
public void actionOtherLanguage() {
String url = URL_OTHER_LANGUAGE;
if (Utilities.isDesktopSupported()) {
Utilities.browseURL(url);
} else {
displayUrlMessage(
GT._("You can learn how to add other languages at the following URL:"),
url);
}
}
/**
* Action called when Login or Demo button is pressed.
*
* @param login Flag indicating if login is required.
*/
private void actionLoginDemo(final boolean login) {
// Check that correct values are entered in Wikipedia combo
if ((comboWikipedia == null) || (comboWikipedia.getSelectedIndex() == -1)) {
displayWarning(
GT._("You must select which Wikipedia you want to work on before login"),
comboWikipedia);
return;
}
setWikipedia((EnumWikipedia) comboWikipedia.getSelectedItem());
// Check that correct values are entered in Language combo
if ((comboLanguage == null) || (comboLanguage.getSelectedIndex() == -1)) {
displayWarning(
GT._("You must select a language before login"),
comboLanguage);
return;
}
EnumLanguage language = (EnumLanguage) comboLanguage.getSelectedItem();
GT.setCurrentLanguage(language);
// Check that correct values are entered for user name
if (login) {
if ((comboUser == null) ||
(comboUser.getSelectedItem() == null) ||
("".equals(comboUser.getSelectedItem().toString().trim()))) {
displayWarning(
GT._("You must input your username before login"),
comboUser);
return;
}
}
// Check that correct values are entered for password
if (login) {
if ((textPassword == null) ||
(textPassword.getPassword() == null) ||
(textPassword.getPassword().length == 0)) {
displayWarning(
GT._("You must input your password before login"),
textPassword);
return;
}
// If password is Ok... continue with validation
char[] password = textPassword.getPassword();
for (int i = 0; i < password.length; i++) {
password[i] = '\0';
}
}
// Update actions
ActionUtilities.removeActionListeners(buttonDisambiguation);
ActionUtilities.removeActionListeners(buttonFullAnalysis);
buttonDisambiguation.addActionListener(new ActionDisambiguationAnalysis(
getParentComponent(), getWikipedia(), comboPagename));
buttonFullAnalysis.addActionListener(new ActionFullAnalysis(
getParentComponent(), getWikipedia(), comboPagename));
// Login
LoginWorker loginWorker = new LoginWorker(
getWikipedia(), this, comboPagename,
(EnumLanguage) comboLanguage.getSelectedItem(),
comboUser.getSelectedItem().toString(),
textPassword.getPassword(),
radSavePassword.isSelected() ?
ConfigurationConstants.VALUE_SAVE_USER_BOTH :
radSaveUsername.isSelected() ?
ConfigurationConstants.VALUE_SAVE_USER_NAME :
ConfigurationConstants.VALUE_SAVE_USER_NONE,
login, false);
loginWorker.setListener(new BasicWorkerListener() {
/**
* Called just at the beginning of the start() method in BasicWorker.
*
* @param worker Current worker.
*/
@Override
public void beforeStart(BasicWorker worker) {
// Nothing to do
}
/**
* Called just at the end of the start() method in BasicWorker.
*
* @param worker Current worker.
*/
@Override
public void afterStart(BasicWorker worker) {
// Nothing to do
}
/**
* Called just at the beginning of the finished() method in BasicWorker.
*
* @param worker Current worker.
*/
@Override
public void beforeFinished(BasicWorker worker) {
if (worker instanceof LoginWorker) {
logged = ((LoginWorker) worker).isLogged();
if (logged) {
userLogged = login;
}
}
}
/**
* Called just at the end of the finished() method in BasicWorker.
*
* @param worker Current worker.
* @param ok Flag indicating if the worker finished OK.
*/
@Override
public void afterFinished(BasicWorker worker, boolean ok) {
// Nothing to do
}
});
loginWorker.start();
}
/**
* Action called when Logout button is pressed.
*/
public void actionLogout() {
API api = APIFactory.getAPI();
api.logout(getWikipedia());
logged = false;
userLogged = false;
updateComponentState();
}
/**
* Action called when Disconnect button is pressed.
*/
public void actionDisconnect() {
logged = false;
userLogged = false;
updateComponentState();
}
/**
* Action called when System Options button is pressed.
*/
public void actionOptionsSystem() {
if (Utilities.isDesktopSupported()) {
EnumWikipedia wikipedia = getWikipedia();
Utilities.browseURL(wikipedia, wikipedia.getConfigurationPage(), true);
} else {
displayUrlMessage(
GT._("You can learn how to configure {0} at the following URL:", Version.PROGRAM),
URL_OTHER_WIKIPEDIA);
}
}
/**
* Action called when Reload System Options button is pressed.
*/
public void actionReloadOptions() {
new LoginWorker(
getWikipedia(), this, comboPagename,
(EnumLanguage) comboLanguage.getSelectedItem(),
comboUser.getSelectedItem().toString(),
textPassword.getPassword(),
radSavePassword.isSelected() ?
ConfigurationConstants.VALUE_SAVE_USER_BOTH :
radSaveUsername.isSelected() ?
ConfigurationConstants.VALUE_SAVE_USER_NAME :
ConfigurationConstants.VALUE_SAVE_USER_NONE,
false, true).start();
}
/**
* Action called when Check Spelling button is pressed.
*/
public void actionCheckSpelling() {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
// Retrieve all suggestions grouped by page and chapter
Map<String, Suggestion> suggestions = wikipedia.getConfiguration().getSuggestions();
Map<String, List<String>> chapters = Suggestion.getChapters(suggestions.values());
if (chapters.isEmpty()) {
return;
}
// Construct list of pages containing suggestions
List<String> pages = new ArrayList<String>();
pages.addAll(chapters.keySet());
Collections.sort(pages);
// Create menu for suggestions
JPopupMenu menu = new JPopupMenu();
for (String page : pages) {
List<String> pageChapters = chapters.get(page);
if (pageChapters.size() > 1) {
JMenu pageMenu = new JMenu(page);
JMenuItem item = new JMenuItem(GT._("Activate all"));
item.setActionCommand(page);
item.addActionListener(EventHandler.create(
ActionListener.class, this, "actionCheckSpellingActivatePage", "actionCommand"));
pageMenu.add(item);
item = new JMenuItem(GT._("Deactivate all"));
item.setActionCommand(page);
item.addActionListener(EventHandler.create(
ActionListener.class, this, "actionCheckSpellingDeactivatePage", "actionCommand"));
pageMenu.add(item);
pageMenu.addSeparator();
for (String chapter : pageChapters) {
boolean active = Suggestion.isChapterActive(page, chapter);
JMenuItem chapterItem = new JCheckBoxMenuItem(chapter);
chapterItem.setSelected(active);
chapterItem.setActionCommand(page + "#" + chapter);
chapterItem.addActionListener(EventHandler.create(
ActionListener.class, this,
active ? "actionCheckSpellingDeactivateChapter" : "actionCheckSpellingActivateChapter",
"actionCommand"));
pageMenu.add(chapterItem);
}
menu.add(pageMenu);
} else {
boolean active = Suggestion.isChapterActive(page, pageChapters.get(0));
JMenuItem pageItem = new JCheckBoxMenuItem(page);
pageItem.setSelected(active);
pageItem.setActionCommand(page + "#" + pageChapters.get(0));
pageItem.addActionListener(EventHandler.create(
ActionListener.class, this,
active ? "actionCheckSpellingDeactivateChapter" : "actionCheckSpellingActivateChapter",
"actionCommand"));
menu.add(pageItem);
}
}
menu.show(
buttonCheckSpelling,
0,
buttonCheckSpelling.getHeight());
}
/**
* Action called to activate spell checking suggestions of a page.
*
* @param page Page.
*/
public void actionCheckSpellingActivatePage(String page) {
actionCheckSpellingPage(page, true);
}
/**
* Action called to deactivate spell checking suggestions of a page.
*
* @param page Page.
*/
public void actionCheckSpellingDeactivatePage(String page) {
actionCheckSpellingPage(page, false);
}
/**
* Action called to activate/deactivate spell checking suggestions of a page.
*
* @param page Page.
* @param activate True to activate spell checking.
*/
private void actionCheckSpellingPage(String page, boolean activate) {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
Map<String, Suggestion> suggestions = wikipedia.getConfiguration().getSuggestions();
Map<String, List<String>> chapters = Suggestion.getChapters(suggestions.values());
Suggestion.activateChapters(page, chapters.get(page), activate);
}
/**
* Action called to activate spell checking suggestions of a chapter.
*
* @param chapter Chapter.
*/
public void actionCheckSpellingActivateChapter(String chapter) {
Suggestion.activateChapters(null, Collections.singletonList(chapter), true);
}
/**
* Action called to deactivate spell checking suggestions of a chapter.
*
* @param chapter Chapter.
*/
public void actionCheckSpellingDeactivateChapter(String chapter) {
Suggestion.activateChapters(null, Collections.singletonList(chapter), false);
}
/**
* Action called when Help button is pressed.
*/
public void actionHelp() {
EnumWikipedia wikipedia = getWikipedia();
WPCConfigurationString attributeHelpURL = WPCConfigurationString.HELP_URL;
String url = EnumWikipedia.EN.getConfiguration().getString(attributeHelpURL);
if ((wikipedia != null) && (wikipedia.getConfiguration().getString(attributeHelpURL) != null)) {
url = wikipedia.getConfiguration().getString(attributeHelpURL);
}
if (Utilities.isDesktopSupported()) {
Utilities.browseURL(url);
} else {
displayUrlMessage(
GT._("You can read the help on {0} at the following URL:", Version.PROGRAM),
url);
}
}
/**
* Action called when Idea button is pressed.
*/
public void actionIdea() {
String url = URL_TALK_PAGE;
if (Utilities.isDesktopSupported()) {
Utilities.browseURL(url);
} else {
displayUrlMessage(
GT._("You can submit bug reports or feature requests at the following URL:"),
url);
}
}
/**
* Action called when Contributions button is pressed.
*/
public void actionContributions() {
EnumWikipedia wikipedia = getWikipedia();
if ((wikipedia != null) && (wikipedia.getContributions() != null)) {
InformationWindow.createInformationWindow(
GT._("Your contributions"),
wikipedia.getContributions().getDescription(), true,
wikipedia);
}
}
/**
* Action called when Save Password is changed.
*/
public void actionSavePassword() {
if ((radSavePassword.isSelected())) {
int answer = displayYesNoWarning(
GT._("The password will be saved on your disk, " +
"so anyone having access to your computer may be able to get it.\n" +
"Are you sure that you want to save it ?"));
if (answer != JOptionPane.YES_OPTION) {
radSaveUsername.setSelected(true);
}
}
}
/**
* Check that page name is given.
*
* @param message Message to display if it's not given.
* @return Page name if it is given.
*/
private String checkPagename(String message) {
if (comboPagename != null) {
Object select = comboPagename.getSelectedItem();
if (select != null) {
String tmp = select.toString().trim();
if (!"".equals(tmp)) {
return tmp;
}
}
}
if (message != null) {
displayWarning(message);
}
return null;
}
/**
* Action called when Internal links button is pressed.
*/
public void actionInternalLinks() {
// Create menu for internal links
JPopupMenu menu = new JPopupMenu();
addItemInInternalLinks(menu, PageListWorker.Mode.INTERNAL_LINKS_MAIN);
addItemInInternalLinks(menu, PageListWorker.Mode.INTERNAL_LINKS_TALKPAGES_CONVERTED);
menu.show(
buttonInternalLinks,
0,
buttonInternalLinks.getHeight());
}
/**
* Add an item to the generate lists menu.
*
* @param menu Menu.
* @param mode List to be generated.
*/
private void addItemInInternalLinks(JPopupMenu menu, PageListWorker.Mode mode) {
JMenuItem item = Utilities.createJMenuItem(mode.getTitle(), true);
item.setActionCommand(mode.name());
item.addActionListener(EventHandler.create(
ActionListener.class, this, "actionInternalLinks", "actionCommand"));
menu.add(item);
}
/**
* Action called when Internal Links button is pressed.
*/
public void actionInternalLinks(String mode) {
String pageName = checkPagename(GT._(
"You must input a page name for retrieving the list of internal links"));
if ((pageName == null) || (mode == null)) {
return;
}
Configuration config = Configuration.getConfiguration();
config.setString(
null,
ConfigurationValueString.PAGE_NAME,
pageName);
config.save();
new PageListWorker(
getWikipedia(), this, DataManager.getPage(getWikipedia(), pageName, null, null, null),
Collections.singletonList(pageName),
PageListWorker.Mode.valueOf(mode), false,
GT._("Internal links in {0}", pageName)).start();
}
/**
* Action called when Search Titles button is pressed.
*/
public void actionSearchTitles() {
String pageName = checkPagename(GT._("You must input a page name"));
if (pageName == null) {
return;
}
new PageListWorker(
getWikipedia(), this, null,
Collections.singletonList(pageName),
PageListWorker.Mode.SEARCH_TITLES, false,
GT._("Search results for {0}", pageName)).start();
}
/**
* Action called when Back links button is pressed.
*/
public void actionBackLinks() {
String pageName = checkPagename(GT._(
"You must input a page name for retrieving the list of backlinks"));
if (pageName == null) {
return;
}
Configuration config = Configuration.getConfiguration();
config.setString(
null,
ConfigurationValueString.PAGE_NAME,
pageName);
config.save();
Page page = DataManager.getPage(
getWikipedia(), pageName, null, null, null);
new PageListWorker(
getWikipedia(), this, page,
Collections.singletonList(pageName),
PageListWorker.Mode.BACKLINKS, false,
GT._("Links to {0}", pageName)).start();
}
/**
* Action called when Category Members button is pressed.
*/
public void actionCategoryMembers() {
String pageName = checkPagename(GT._(
"You must input a page name for retrieving the list of category members"));
if (pageName == null) {
return;
}
Configuration config = Configuration.getConfiguration();
config.setString(
null,
ConfigurationValueString.PAGE_NAME,
pageName);
config.save();
String title = getWikipedia().getWikiConfiguration().getPageTitle(
Namespace.CATEGORY, pageName);
Page page = DataManager.getPage(
getWikipedia(), title, null, null, null);
new PageListWorker(
getWikipedia(), this, page,
Collections.singletonList(title),
PageListWorker.Mode.CATEGORY_MEMBERS, false,
GT._("Category members of {0}", title)).start();
}
/**
* Action called when Embedded In button is pressed.
*/
public void actionEmbeddedIn() {
String pageName = checkPagename(GT._(
"You must input a page name for retrieving the list of page in which it is embedded"));
if (pageName == null) {
return;
}
Configuration config = Configuration.getConfiguration();
config.setString(
null,
ConfigurationValueString.PAGE_NAME,
pageName);
config.save();
String title = getWikipedia().getWikiConfiguration().getPageTitle(
Namespace.TEMPLATE, pageName);
Page page = DataManager.getPage(
getWikipedia(), title, null, null, null);
new PageListWorker(
getWikipedia(), this, page,
Collections.singletonList(title),
PageListWorker.Mode.EMBEDDED_IN, false,
GT._("Template {0} embedded in", title)).start();
}
/**
* Action called when Current Disambiguation List is pressed.
*/
public void actionCurrentDabList() {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
WPCConfiguration configuration = wikipedia.getConfiguration();
List<String> currentDabList = configuration.getStringList(WPCConfigurationStringList.CURRENT_DAB_LIST);
if ((currentDabList == null) ||
(currentDabList.isEmpty())) {
Utilities.displayMessageForMissingConfiguration(
getParentComponent(),
WPCConfigurationStringList.CURRENT_DAB_LIST.getAttributeName());
return;
}
new PageListWorker(
wikipedia, this, null,
currentDabList,
PageListWorker.Mode.INTERNAL_LINKS_MAIN, false,
GT._("Current disambiguation list")).start();
}
/**
* Action called when "Pages with most disambiguation links" is pressed.
*/
public void actionMostDabLinks() {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
WPCConfiguration configuration = wikipedia.getConfiguration();
List<String> mostDabLinks = configuration.getStringList(WPCConfigurationStringList.MOST_DAB_LINKS);
if ((mostDabLinks == null) ||
(mostDabLinks.isEmpty())) {
Utilities.displayMessageForMissingConfiguration(
getParentComponent(),
WPCConfigurationStringList.MOST_DAB_LINKS.getAttributeName());
return;
}
new PageListWorker(
wikipedia, this, null,
mostDabLinks,
PageListWorker.Mode.CATEGORY_MEMBERS_ARTICLES,
false,
GT._("Pages with many disambiguation links")).start();
}
/**
* Action called when Help Requested On is pressed.
*/
public void actionHelpRequestedOn() {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
WPCConfiguration configuration = wikipedia.getConfiguration();
List<Page> templates = configuration.getTemplatesForHelpRequested();
if ((templates == null) ||
(templates.isEmpty())) {
Utilities.displayMessageForMissingConfiguration(
getParentComponent(),
WPCConfigurationStringList.TEMPLATES_FOR_HELP_REQUESTED.getAttributeName());
return;
}
List<String> pageNames = new ArrayList<String>();
for (Page template : templates) {
pageNames.add(template.getTitle());
}
new PageListWorker(
wikipedia, this, null,
pageNames, PageListWorker.Mode.EMBEDDED_IN, false,
GT._("Help requested on...")).start();
}
/**
* Action called when Abuse Filters button is pressed.
*/
public void actionAbuseFilters() {
try {
API api = APIFactory.getAPI();
List<AbuseFilter> abuseFilters = api.retrieveAbuseFilters(getWikipedia());
if ((abuseFilters != null) && (abuseFilters.size() > 0)) {
Object filter = Utilities.askForValue(
getParentComponent(),
GT._("What abuse filter are you interested in?"),
abuseFilters.toArray(), abuseFilters.get(0));
if ((filter != null) && (filter instanceof AbuseFilter)) {
AbuseFilter abuseFilter = (AbuseFilter) filter;
List<Page> pages = api.retrieveAbuseLog(
getWikipedia(), abuseFilter.getId(), null);
if ((pages != null) && (!pages.isEmpty())) {
List<String> pageNames = new ArrayList<String>(pages.size());
for (Page page : pages) {
if (!pageNames.contains(page.getTitle())) {
pageNames.add(page.getTitle());
}
}
new PageListWorker(
getWikipedia(), this, null,
pageNames, PageListWorker.Mode.DIRECT, false,
GT._("Hits for filter {0}", filter.toString())).start();
}
}
}
} catch (APIException e) {
displayError(e);
}
}
/**
* Action called when Special Lists button is pressed.
*/
public void actionSpecialLists() {
// Create menu for special lists
JPopupMenu menu = new JPopupMenu();
for (EnumQueryPage query : EnumQueryPage.values()) {
JMenuItem item = new JMenuItem(query.getName());
item.setActionCommand(query.getCode());
item.addActionListener(EventHandler.create(
ActionListener.class, this, "actionSpecialList", "actionCommand"));
menu.add(item);
}
menu.show(
buttonSpecialLists,
0,
buttonSpecialLists.getHeight());
}
/**
* Action called to get a special list.
*
* @param code Query code.
*/
public void actionSpecialList(String code) {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
EnumQueryPage query = EnumQueryPage.findByCode(code);
if (query == null) {
return;
}
new PageListWorker(
wikipedia, this, null,
Collections.singletonList(code),
PageListWorker.Mode.QUERY_PAGE, false,
query.getName()).start();
}
/**
* Action called when All disambiguations pages is pressed.
*/
public void actionAllDab() {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
new PageListWorker(
wikipedia, this, null,
null, PageListWorker.Mode.ALL_DAB_PAGES, false,
GT._("All disambiguations pages")).start();
}
/**
* Action called when Check Wiki is pressed.
*/
public void actionCheckWiki() {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
if (!wikipedia.getCWConfiguration().isProjectAvailable()) {
Utilities.displayMissingConfiguration(getParentComponent(), null);
return;
}
Controller.runCheckWikiProject(getWikipedia());
}
/**
* Action called when Bot Tools is pressed.
*/
public void actionBotTools() {
Controller.runBotTools(getWikipedia());
}
/**
* Action called when Random page button is pressed.
*/
public void actionRandomPage() {
new RandomPageWorker(getWikipedia(), this, comboPagename).start();
}
/**
* Action called when Add page button is pressed.
*/
public void actionAddPage() {
String pageName = checkPagename(null);
if (pageName == null) {
return;
}
Configuration config = Configuration.getConfiguration();
List<String> interestingPages = config.getStringList(
null, Configuration.ARRAY_INTERESTING_PAGES);
if (interestingPages == null) {
interestingPages = new ArrayList<String>();
}
if (!interestingPages.contains(pageName)) {
interestingPages.add(pageName);
Collections.sort(interestingPages);
config.setStringList(null, Configuration.ARRAY_INTERESTING_PAGES, interestingPages);
comboPagename.removeAllItems();
for (String page : interestingPages) {
comboPagename.addItem(page);
}
}
}
/**
* Action called when Remove page button is pressed.
*/
public void actionRemovePage() {
String pageName = checkPagename(null);
if (pageName == null) {
return;
}
Configuration config = Configuration.getConfiguration();
List<String> interestingPages = config.getStringList(
null, Configuration.ARRAY_INTERESTING_PAGES);
if (interestingPages == null) {
return;
}
if (interestingPages.contains(pageName)) {
interestingPages.remove(pageName);
Collections.sort(interestingPages);
config.setStringList(null, Configuration.ARRAY_INTERESTING_PAGES, interestingPages);
comboPagename.removeAllItems();
for (String page : interestingPages) {
comboPagename.addItem(page);
}
}
}
/**
* Action called when Generate List button is pressed.
*/
public void actionGenerateLists() {
// Create menu for generating lists
JPopupMenu menu = new JPopupMenu();
addItemInGenerateLists(menu, PageListWorker.Mode.MISSING_TEMPLATES);
addItemInGenerateLists(menu, PageListWorker.Mode.PROTECTED_TITLES);
menu.show(
buttonGenerateLists,
0,
buttonGenerateLists.getHeight());
}
/**
* Add an item to the generate lists menu.
*
* @param menu Menu.
* @param mode List to be generated.
*/
private void addItemInGenerateLists(JPopupMenu menu, PageListWorker.Mode mode) {
JMenuItem item = Utilities.createJMenuItem(mode.getTitle(), true);
item.setActionCommand(mode.name());
item.addActionListener(EventHandler.create(
ActionListener.class, this, "actionGenerateList", "actionCommand"));
menu.add(item);
}
/**
* Action called to generate a list.
*
* @param name List name.
*/
public void actionGenerateList(String name) {
EnumWikipedia wiki = getWikipedia();
if (wiki == null) {
return;
}
PageListWorker.Mode mode = PageListWorker.Mode.valueOf(name);
if (mode == null) {
return;
}
new PageListWorker(
wiki, this, null, null,
mode, false, mode.getTitle()).start();
}
/**
* Action called when local watch list button is pressed.
*/
public void actionWatchlistLocal() {
Configuration config = Configuration.getConfiguration();
List<String> pageNames = config.getStringList(getWikipedia(), Configuration.ARRAY_WATCH_PAGES);
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
new PageListWorker(
wikipedia, this, null,
pageNames, PageListWorker.Mode.DIRECT, true,
GT._("Local Watchlist")).start();
}
/**
* Action called when watch list button is pressed.
*/
public void actionWatchlist() {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
new PageListWorker(
wikipedia, this, null,
null, PageListWorker.Mode.WATCH_LIST, true,
GT._("Watch list")).start();
}
/**
* Action called when Load List button is pressed.
*/
public void actionLoadList() {
EnumWikipedia wikipedia = getWikipedia();
if (wikipedia == null) {
return;
}
// Ask which file should be loaded
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"Text files", "txt");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(this.getParentComponent());
if (returnVal != JFileChooser.APPROVE_OPTION) {
return;
}
File chosenFile = chooser.getSelectedFile();
if ((chosenFile == null) ||
!chosenFile.isFile() ||
!chosenFile.canRead()){
return;
}
// Ask in which format the file is
String[] values = {
GT._("Unformatted list of page names"),
GT._("Internal links in a formatted list")
};
String message =
GT._("The file must be encoded in UTF-8 to be read correctly.") + "\n" +
GT._("In which format is the file?");
String value = Utilities.askForValue(
getParentComponent(), message, values, true, values[0], (StringChecker) null);
if (value == null) {
return;
}
int choice = 0;
for (int i = 0; i < values.length; i++) {
if (value.equals(values[i])) {
choice = i;
}
}
// Read file
List<String> pages = new ArrayList<String>();
BufferedReader reader = null;
String line = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(chosenFile), "UTF8"));
switch (choice) {
case 0: // Unformatted list
while ((line = reader.readLine()) != null) {
if (line.trim().length() > 0) {
pages.add(line);
}
}
break;
case 1: // Formatted list with internal links
StringBuilder buffer = new StringBuilder();
while ((line = reader.readLine()) != null) {
if (buffer.length() > 0) {
buffer.append('\n');
}
buffer.append(line);
}
Page tmpPage = DataManager.getPage(getWiki(), chosenFile.getName(), null, null, null);
String contents = buffer.toString();
tmpPage.setContents(contents);
PageAnalysis analysis = tmpPage.getAnalysis(contents, false);
List<PageElementInternalLink> links = analysis.getInternalLinks();
for (PageElementInternalLink link : links) {
String target = link.getLink();
if (target.startsWith(":")) {
target = target.substring(1);
}
if (!pages.contains(target)) {
pages.add(target);
}
}
break;
}
new PageListWorker(
wikipedia, this, null,
pages, PageListWorker.Mode.DIRECT, true,
GT._("List")).start();
} catch (IOException e) {
//
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception e) {
//
}
}
}
}
/**
* Action called when Random pages button is pressed.
*/
public void actionRandom() {
JPopupMenu menu = new JPopupMenu();
JMenuItem item = new JMenuItem(GT._("Random pages"));
item.addActionListener(EventHandler.create(
ActionListener.class, this, "actionRandomPages"));
menu.add(item);
item = new JMenuItem(GT._("Random redirect pages"));
item.addActionListener(EventHandler.create(
ActionListener.class, this, "actionRandomRedirects"));
menu.add(item);
menu.show(
buttonRandomPages,
0,
buttonRandomPages.getHeight());
}
/**
* Action called when Random Pages button is pressed.
*/
public void actionRandomPages() {
actionRandomArticles(false);
}
/**
* Action called when Random Redirects button is pressed.
*/
public void actionRandomRedirects() {
actionRandomArticles(true);
}
/**
* @param redirects True if redirects are requested.
*/
private void actionRandomArticles(boolean redirects) {
final int maxPages = 50;
int count = 0;
while ((count < 1) || (count > maxPages)) {
String answer = askForValue(
GT._("How many pages do you want?"),
"20", null);
if (answer == null) {
return;
}
try {
count = Integer.parseInt(answer);
} catch (NumberFormatException e) {
return;
}
if ((count < 1) || (count > maxPages)) {
displayWarning(GT._(
"The number of pages must be between {0} and {1}",
new Object[] { Integer.valueOf(0), Integer.valueOf(maxPages) } ));
}
}
API api = APIFactory.getAPI();
try {
List<String> pageNames = new ArrayList<String>(count);
while (pageNames.size() < count) {
List<Page> pages = api.getRandomPages(getWikipedia(), count - pageNames.size(), redirects);
for (int i = 0; i < pages.size(); i++) {
pageNames.add(pages.get(i).getTitle());
}
}
Collections.sort(pageNames);
new PageListWorker(
getWikipedia(), this, null, pageNames,
PageListWorker.Mode.DIRECT, false,
GT._("Random pages")).start();
} catch (APIException e) {
displayError(e);
return;
}
}
/**
* Action called when Language is changed.
*/
public void actionChangeLanguage() {
if (comboLanguage.getSelectedItem() instanceof EnumLanguage) {
EnumLanguage language = (EnumLanguage) comboLanguage.getSelectedItem();
GT.setCurrentLanguage(language);
}
}
/**
* Action called when Wiki is changed.
*
* Reset users list based on current wikipedia.
*/
public void actionChangeWiki() {
comboUser.removeAllItems();
comboUser.setSelectedItem("");
if (comboWikipedia.getSelectedItem() instanceof EnumWikipedia) {
EnumWikipedia wikipedia = (EnumWikipedia) comboWikipedia.getSelectedItem();
Configuration configuration = Configuration.getConfiguration();
Properties users = configuration.getProperties(wikipedia, Configuration.PROPERTIES_USERS);
for (Object user : users.keySet()) {
comboUser.addItem(user);
}
if (comboUser.getItemCount() > 0) {
comboUser.setSelectedIndex(0);
}
String lastUser = configuration.getString(wikipedia, ConfigurationValueString.LAST_USER);
if (lastUser != null) {
comboUser.setSelectedItem(lastUser);
}
}
actionChangeUser();
}
/**
* Action called when User is changed.
*
* Reset password based on current wikipedia and user.
*/
public void actionChangeUser() {
textPassword.setText("");
if ((comboWikipedia.getSelectedItem() instanceof EnumWikipedia) &&
(comboUser.getSelectedItem() instanceof String)) {
EnumWikipedia wikipedia = (EnumWikipedia) comboWikipedia.getSelectedItem();
Configuration configuration = Configuration.getConfiguration();
Properties users = configuration.getProperties(wikipedia, Configuration.PROPERTIES_USERS);
String password = users.getProperty(comboUser.getSelectedItem().toString());
if (password != null) {
textPassword.setText(password);
}
}
}
/**
* @return Page.
* @see org.wikipediacleaner.api.dataaccess.PageProvider#getPage()
*/
@Override
public Page getPage() {
String pageName = checkPagename(null);
if (pageName != null) {
return DataManager.getPage(getWikipedia(), pageName, null, null, null);
}
return null;
}
}