/*
* 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.menu;
import java.awt.Component;
import java.awt.event.ActionListener;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.data.Namespace;
import org.wikipediacleaner.api.data.Page;
import org.wikipediacleaner.api.data.PageAnalysis;
import org.wikipediacleaner.api.data.PageAnalysisUtils;
import org.wikipediacleaner.api.data.PageElementTemplate;
import org.wikipediacleaner.api.data.PageElementTitle;
import org.wikipediacleaner.gui.swing.action.ActionCheckTemplate;
import org.wikipediacleaner.gui.swing.action.ActionDisambiguationAnalysis;
import org.wikipediacleaner.gui.swing.action.ActionExternalViewer;
import org.wikipediacleaner.gui.swing.action.ActionFullAnalysis;
import org.wikipediacleaner.gui.swing.action.PurgeCacheAction;
import org.wikipediacleaner.gui.swing.action.ReloadLinksAction;
import org.wikipediacleaner.gui.swing.action.RemoveLinkAction;
import org.wikipediacleaner.gui.swing.basic.BasicWindow;
import org.wikipediacleaner.gui.swing.basic.Utilities;
import org.wikipediacleaner.gui.swing.component.MWPane;
import org.wikipediacleaner.i18n.GT;
/**
* A helper class to manage contextual menu.
*/
public class BasicMenuCreator extends AbstractMenuCreator {
// ==========================================================================
// Menu creation
// ==========================================================================
/**
* @param title Possible title for the menu.
* @return Popup menu.
*/
public JPopupMenu createPopupMenu(String title) {
JPopupMenu menu = new JPopupMenu();
addDisabledText(menu, title);
return menu;
}
// ==========================================================================
// View pages
// ==========================================================================
/**
* Add submenus for viewing pages.
*
* @param wiki Wiki.
* @param popup Popup menu.
* @param page Page.
* @param showLinks True if internal links should be displayed.
*/
public void addView(
EnumWikipedia wiki, JPopupMenu popup,
Page page, boolean showLinks) {
if ((wiki == null) || (popup == null) || (page == null)) {
return;
}
List<Page> links = page.getLinksWithRedirect();
if (Utilities.isDesktopSupported()) {
if (((links != null) && (links.size() > 0) && showLinks) ||
page.isRedirect()) {
int fixedBeginView = 0;
int fixedEndView = 0;
int fixedBeginHistory = 0;
int fixedEndHistory = 0;
JMenu submenuView = new JMenu(GT._("External Viewer"));
JMenu submenuHistory = new JMenu(GT._("History"));
Iterator<Page> iter = page.getRedirectIteratorWithPage();
while (iter.hasNext()) {
Page pageTmp = iter.next();
fixedBeginView += addItem(
submenuView, pageTmp, null, true,
new ActionExternalViewer(wiki, pageTmp.getTitle()));
fixedBeginHistory += addItem(
submenuHistory, pageTmp, null, true,
new ActionExternalViewer(
wiki, pageTmp.getTitle(), ActionExternalViewer.ACTION_HISTORY));
}
if ((links != null) && (links.size() > 0) && showLinks) {
fixedBeginView += addSeparator(submenuView);
fixedBeginHistory += addSeparator(submenuHistory);
for (Page p : links) {
if (p.isRedirect()) {
JMenu submenuRedirectView = new JMenu(p.getTitle());
JMenu submenuRedirectHistory = new JMenu(p.getTitle());
Iterator<Page> itPage = p.getRedirectIteratorWithPage();
while (itPage.hasNext()) {
Page redirect = itPage.next();
addItem(
submenuRedirectView, redirect, null, true,
new ActionExternalViewer(wiki, redirect.getTitle()));
addItem(
submenuRedirectHistory, redirect, null, true,
new ActionExternalViewer(
wiki, redirect.getTitle(), ActionExternalViewer.ACTION_HISTORY));
}
submenuView.add(submenuRedirectView);
submenuHistory.add(submenuRedirectHistory);
} else {
addItem(
submenuView, p, null, true,
new ActionExternalViewer(wiki, p.getTitle()));
addItem(
submenuHistory, p, null, true,
new ActionExternalViewer(
wiki, p.getTitle(), ActionExternalViewer.ACTION_HISTORY));
}
}
fixedEndView += addSeparator(submenuView);
fixedEndHistory += addSeparator(submenuHistory);
iter = page.getRedirectIteratorWithPage();
while (iter.hasNext()) {
Page pageTmp = iter.next();
fixedEndView += addItem(
submenuView, pageTmp, null, true,
new ActionExternalViewer(wiki, pageTmp.getTitle()));
fixedEndHistory += addItem(
submenuHistory, pageTmp, null, true,
new ActionExternalViewer(
wiki, pageTmp.getTitle(), ActionExternalViewer.ACTION_HISTORY));
}
}
addSubmenu(popup, submenuView, fixedBeginView, fixedEndView);
addSubmenu(popup, submenuHistory, fixedBeginHistory, fixedEndHistory);
} else {
String title = null;
if ((page.getNamespace() != null) &&
(page.getNamespace().intValue() == Namespace.TEMPLATE)) {
title = GT._("Template External Viewer");
} else {
title = GT._("External Viewer");
}
addItem(
popup, page, title, true,
new ActionExternalViewer(wiki, page.getTitle()));
if ((page.getNamespace() != null) &&
(page.getNamespace().intValue() == Namespace.TEMPLATE)) {
title = GT._("Template history");
} else {
title = GT._("History");
}
addItem(
popup, page, title, true,
new ActionExternalViewer(
wiki, page.getTitle(), ActionExternalViewer.ACTION_HISTORY));
}
}
}
// ==========================================================================
// Analyze pages
// ==========================================================================
/**
* Add submenus for analyzing pages.
*
* @param wiki Wiki.
* @param popup Popup menu.
* @param page Page.
*/
public void addAnalyze(
EnumWikipedia wiki, JPopupMenu popup, Page page) {
if ((wiki == null) || (popup == null) || (page == null)) {
return;
}
JMenuItem menuItem = null;
ActionListener action = null;
List<Page> links = page.getLinksWithRedirect();
if (((links != null) && (links.size() > 0)) || page.isRedirect()) {
int fixedBegin = 0;
int fixedEnd = 0;
JMenu submenuAnalyze = new JMenu(GT._("Analyze"));
Iterator<Page> iter = page.getRedirectIteratorWithPage();
while (iter.hasNext()) {
Page pageTmp = iter.next();
menuItem = new JMenuItem(pageTmp.getTitle());
updateFont(menuItem, pageTmp);
action = new ActionFullAnalysis(wiki, pageTmp.getTitle());
menuItem.addActionListener(action);
submenuAnalyze.add(menuItem);
fixedBegin++;
}
if ((links != null) && (links.size() > 0)) {
fixedBegin += addSeparator(submenuAnalyze);
for (Page p : links) {
menuItem = new JMenuItem(p.getTitle());
updateFont(menuItem, p);
action = new ActionFullAnalysis(wiki, p.getTitle());
menuItem.addActionListener(action);
submenuAnalyze.add(menuItem);
}
fixedEnd += addSeparator(submenuAnalyze);
iter = page.getRedirectIteratorWithPage();
while (iter.hasNext()) {
Page pageTmp = iter.next();
menuItem = new JMenuItem(pageTmp.getTitle());
updateFont(menuItem, pageTmp);
action = new ActionFullAnalysis(wiki, pageTmp.getTitle());
menuItem.addActionListener(action);
submenuAnalyze.add(menuItem);
fixedEnd++;
}
}
addSubmenu(popup, submenuAnalyze, fixedBegin, fixedEnd);
} else {
if ((page.getNamespace() != null) &&
(page.getNamespace().intValue() == Namespace.TEMPLATE)) {
menuItem = new JMenuItem(GT._("Analyze template"));
} else {
menuItem = new JMenuItem(GT._("Analyze page"));
}
action = new ActionFullAnalysis(wiki, page.getTitle());
menuItem.addActionListener(action);
popup.add(menuItem);
}
}
// ==========================================================================
// Analyze disambiguation pages
// ==========================================================================
/**
* Add submenus for disambiguation.
*
* @param wiki Wiki.
* @param popup Popup menu.
* @param page Page.
*/
public void addDisambiguation(
EnumWikipedia wiki, JPopupMenu popup, Page page) {
if ((wiki == null) || (popup == null) || (page == null)) {
return;
}
if (Boolean.TRUE.equals(page.isDisambiguationPage())) {
if (!page.isRedirect()) {
JMenuItem menuItem = new JMenuItem(GT._("Disambiguation analysis"));
ActionListener action = new ActionDisambiguationAnalysis(wiki, page.getTitle());
menuItem.addActionListener(action);
popup.add(menuItem);
} else {
JMenu submenuView = new JMenu(GT._("Disambiguation analysis"));
Iterator<Page> iter = page.getRedirectIteratorWithPage();
while (iter.hasNext()) {
Page pageTmp = iter.next();
JMenuItem menuItem = new JMenuItem(pageTmp.getTitle());
updateFont(menuItem, pageTmp);
ActionListener action = new ActionDisambiguationAnalysis(wiki, pageTmp.getTitle());
menuItem.addActionListener(action);
submenuView.add(menuItem);
}
popup.add(submenuView);
}
}
}
// ==========================================================================
// Show current chapter
// ==========================================================================
/**
* Add sub menus for showing current chapter organization.
*
* @param popup Pop up menu.
* @param position Current position in text.
* @param pageAnalysis Page analysis.
*/
public void addCurrentChapter(
JPopupMenu popup,
int position, PageAnalysis pageAnalysis) {
if ((popup == null) || (pageAnalysis == null)) {
return;
}
Collection<PageElementTitle> chapters =
PageAnalysisUtils.getCurrentTitles(pageAnalysis, position);
if ((chapters != null) && !chapters.isEmpty()) {
JMenu submenu = new JMenu(GT._("Current chapter"));
for (PageElementTitle chapter : chapters) {
addDisabledText(submenu, chapter.toString());
}
addSubmenu(popup, submenu, 0, 0);
}
}
// ==========================================================================
// Basic actions
// ==========================================================================
/**
* Add item for removing link.
*
* @param popup Popup menu.
* @param text Text.
* @param textPane Text pane.
* @param startOffset Start offset.
* @param endOffset End offset.
*/
public void addItemRemoveLink(
JPopupMenu popup, String text,
MWPane textPane, int startOffset, int endOffset) {
if (text != null) {
addItem(
popup, null, GT._("Remove link"), true,
new RemoveLinkAction(text, textPane, startOffset, endOffset));
}
}
/**
* Add item for viewing page.
*
* @param wiki Wiki.
* @param popup Popup menu.
* @param url URL.
*/
public void addItemView(
EnumWikipedia wiki, JPopupMenu popup, String url) {
addItemView(wiki, popup, url, GT._("External Viewer"));
}
/**
* Add item for viewing page.
*
* @param wiki Wiki.
* @param popup Popup menu.
* @param url URL.
* @param label Menu label.
*/
public void addItemView(
EnumWikipedia wiki, JPopupMenu popup, String url, String label) {
if ((url != null) && (Utilities.isDesktopSupported())) {
addItem(popup, null, label, true, new ActionExternalViewer(wiki, url));
}
}
/**
* Add item for viewing page.
*
* @param wiki Wiki.
* @param menu Menu.
* @param url URL.
* @param label Menu label.
*/
public void addItemView(
EnumWikipedia wiki, JMenu menu, String url, String label) {
if ((url != null) && (Utilities.isDesktopSupported())) {
addItem(menu, null, label, true, new ActionExternalViewer(wiki, url));
}
}
/**
* Add item for purging page cache.
*
* @param wiki Wiki.
* @param popup Popup menu.
* @param page Page.
* @param window Window.
*/
public void addItemPurgeCache(
EnumWikipedia wiki, JPopupMenu popup, Page page, BasicWindow window) {
if (page != null) {
addItem(
popup, null, GT._("Purge cache"), true,
new PurgeCacheAction(wiki, page, window));
}
}
/**
* Add item for reloading links.
*
* @param wiki Wiki.
* @param popup Popup menu.
* @param page Page.
* @param window Window.
*/
public void addItemReloadLinks(
EnumWikipedia wiki, JPopupMenu popup, Page page, BasicWindow window) {
if ((wiki == null) || (popup == null) || (window == null)) {
return;
}
addItem(
popup, null, GT._("Reload links"), true,
new ReloadLinksAction(wiki, page, window));
}
// ==========================================================================
// Check article
// ==========================================================================
/**
* Add menu for checking template.
*
* @param wiki Wiki.
* @param parent Parent component.
* @param popup Popup menu.
* @param template Template.
*/
public void addCheckTemplate(
EnumWikipedia wiki, Component parent, JPopupMenu popup,
PageElementTemplate template) {
if ((popup == null) || (template == null)) {
return;
}
popup.add(ActionCheckTemplate.createMenuItem(parent, wiki, template));
}
}