package org.gudy.azureus2.ui.swt.mainwindow;
import java.util.Iterator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.pluginsimpl.local.download.DownloadManagerImpl;
import org.gudy.azureus2.ui.common.util.MenuItemManager;
import org.gudy.azureus2.ui.swt.*;
import org.gudy.azureus2.ui.swt.beta.BetaWizard;
import org.gudy.azureus2.ui.swt.components.shell.ShellManager;
import org.gudy.azureus2.ui.swt.config.wizard.ConfigureWizard;
import org.gudy.azureus2.ui.swt.debug.UIDebugGenerator;
import org.gudy.azureus2.ui.swt.donations.DonationWindow;
import org.gudy.azureus2.ui.swt.exporttorrent.wizard.ExportTorrentWizard;
import org.gudy.azureus2.ui.swt.help.AboutWindow;
import org.gudy.azureus2.ui.swt.help.HealthHelpWindow;
import org.gudy.azureus2.ui.swt.importtorrent.wizard.ImportTorrentWizard;
import org.gudy.azureus2.ui.swt.maketorrent.NewTorrentWizard;
import org.gudy.azureus2.ui.swt.minibar.AllTransfersBar;
import org.gudy.azureus2.ui.swt.minibar.MiniBarManager;
import org.gudy.azureus2.ui.swt.nat.NatTestWindow;
import org.gudy.azureus2.ui.swt.pluginsinstaller.InstallPluginWizard;
import org.gudy.azureus2.ui.swt.pluginsuninstaller.UnInstallPluginWizard;
import org.gudy.azureus2.ui.swt.sharing.ShareUtils;
import org.gudy.azureus2.ui.swt.shells.CoreWaiterSWT;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import org.gudy.azureus2.ui.swt.speedtest.SpeedTestWizard;
import org.gudy.azureus2.ui.swt.update.UpdateMonitor;
import org.gudy.azureus2.ui.swt.views.table.TableViewSWT;
import org.gudy.azureus2.ui.swt.views.table.utils.TableContextMenuManager;
import org.gudy.azureus2.ui.swt.views.utils.ManagerUtils;
import org.gudy.azureus2.ui.swt.welcome.WelcomeWindow;
import com.aelitis.azureus.core.*;
import com.aelitis.azureus.core.vuzefile.VuzeFileComponent;
import com.aelitis.azureus.core.vuzefile.VuzeFileHandler;
import com.aelitis.azureus.ui.UIFunctions;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.mdi.MdiEntry;
import com.aelitis.azureus.ui.mdi.MultipleDocumentInterface;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.UIFunctionsSWT;
import org.gudy.azureus2.plugins.ui.menus.MenuManager;
import org.gudy.azureus2.plugins.ui.tables.*;
import org.gudy.azureus2.plugins.update.Update;
import org.gudy.azureus2.plugins.update.UpdateCheckInstance;
import org.gudy.azureus2.plugins.update.UpdateCheckInstanceListener;
public class MenuFactory
implements IMenuConstants
{
private static boolean isAZ3 = "az3".equalsIgnoreCase(COConfigurationManager.getStringParameter("ui"));
public static MenuItem createFileMenuItem(Menu menuParent) {
return createTopLevelMenuItem(menuParent, MENU_ID_FILE);
}
public static MenuItem createTransfersMenuItem(Menu menuParent) {
MenuItem transferMenuItem = createTopLevelMenuItem(menuParent,
MENU_ID_TRANSFERS);
Menu transferMenu = transferMenuItem.getMenu();
MenuFactory.addStartAllMenuItem(transferMenu);
MenuFactory.addStopAllMenuItem(transferMenu);
final MenuItem itemPause = MenuFactory.addPauseMenuItem(transferMenu);
final MenuItem itemResume = MenuFactory.addResumeMenuItem(transferMenu);
// if (notMainWindow) {
// MenuFactory.performOneTimeDisable(itemPause, true);
// MenuFactory.performOneTimeDisable(itemResume, true);
// }
transferMenu.addMenuListener(new MenuListener() {
public void menuShown(MenuEvent menu) {
if (!AzureusCoreFactory.isCoreRunning()) {
itemPause.setEnabled(false);
itemResume.setEnabled(false);
} else {
AzureusCore core = AzureusCoreFactory.getSingleton();
itemPause.setEnabled(core.getGlobalManager().canPauseDownloads());
itemResume.setEnabled(core.getGlobalManager().canResumeDownloads());
}
}
public void menuHidden(MenuEvent menu) {
}
});
return transferMenuItem;
}
public static MenuItem createViewMenuItem(Menu menuParent) {
return createTopLevelMenuItem(menuParent, MENU_ID_VIEW);
}
public static MenuItem createAdvancedMenuItem(Menu menuParent) {
return createTopLevelMenuItem(menuParent, MENU_ID_ADVANCED);
}
public static Menu createTorrentMenuItem(final Menu menuParent) {
final Menu torrentMenu = createTopLevelMenuItem(menuParent,
MENU_ID_TORRENT).getMenu();
/*
* The Torrents menu is context-sensitive to which torrent is selected in the UI.
* For this reason we need to dynamically build the menu when ever it is about to be displayed
* so that the states of the menu items accurately reflect what was selected in the UI.
*/
MenuBuildUtils.addMaintenanceListenerForMenu(torrentMenu,
new MenuBuildUtils.MenuBuilder() {
public void buildMenu(Menu menu, MenuEvent menuEvent) {
buildTorrentMenu(menu);
}
});
return torrentMenu;
}
public static void buildTorrentMenu(Menu menu) {
DownloadManager[] current_dls = (DownloadManager[]) menu.getData("downloads");
if (current_dls == null) {
return;
}
if (AzureusCoreFactory.isCoreRunning()) {
boolean is_detailed_view = ((Boolean) menu.getData("is_detailed_view")).booleanValue();
TableViewSWT tv = (TableViewSWT) menu.getData("TableView");
AzureusCore core = AzureusCoreFactory.getSingleton();
TorrentUtil.fillTorrentMenu(menu, current_dls, core,
menu.getShell(), !is_detailed_view, 0, tv);
}
org.gudy.azureus2.plugins.ui.menus.MenuItem[] menu_items;
menu_items = MenuItemManager.getInstance().getAllAsArray(
new String[] {
MenuManager.MENU_TORRENT_MENU,
MenuManager.MENU_DOWNLOAD_CONTEXT
});
final Object[] plugin_dls = DownloadManagerImpl.getDownloadStatic(current_dls);
if (menu_items.length > 0) {
addSeparatorMenuItem(menu);
MenuBuildUtils.addPluginMenuItems(menu.getShell(),
menu_items, menu, true, true,
new MenuBuildUtils.MenuItemPluginMenuControllerImpl(
plugin_dls));
}
menu_items = null;
/**
* OK, "hack" time - we'll allow plugins which add menu items against
* a table to appear in this menu. We'll have to fake the table row
* object though. All downloads need to share a common table.
*/
String table_to_use = null;
for (int i = 0; i < current_dls.length; i++) {
String table_name = (current_dls[i].isDownloadComplete(false)
? TableManager.TABLE_MYTORRENTS_COMPLETE
: TableManager.TABLE_MYTORRENTS_INCOMPLETE);
if (table_to_use == null || table_to_use.equals(table_name)) {
table_to_use = table_name;
} else {
table_to_use = null;
break;
}
}
if (table_to_use != null) {
menu_items = TableContextMenuManager.getInstance().getAllAsArray(
table_to_use);
}
if (menu_items != null) {
addSeparatorMenuItem(menu);
TableRow[] dls_as_rows = null;
dls_as_rows = new TableRow[plugin_dls.length];
for (int i = 0; i < plugin_dls.length; i++) {
dls_as_rows[i] = wrapAsRow(plugin_dls[i], table_to_use);
}
MenuBuildUtils.addPluginMenuItems(menu.getShell(),
menu_items, menu, true, true,
new MenuBuildUtils.MenuItemPluginMenuControllerImpl(
dls_as_rows));
}
}
public static MenuItem createToolsMenuItem(Menu menuParent) {
return createTopLevelMenuItem(menuParent, MENU_ID_TOOLS);
}
/**
* Creates the Plugins menu item and all it's children
* @param menuParent
* @param includeGetPluginsMenu if <code>true</code> then also include a menu item for getting new plugins
* @return
*/
public static MenuItem createPluginsMenuItem(final Menu menuParent,
final boolean includeGetPluginsMenu) {
MenuItem pluginsMenuItem = createTopLevelMenuItem(menuParent,
MENU_ID_PLUGINS);
MenuBuildUtils.addMaintenanceListenerForMenu(pluginsMenuItem.getMenu(),
new MenuBuildUtils.MenuBuilder() {
public void buildMenu(Menu menu, MenuEvent menuEvent) {
PluginsMenuHelper.getInstance().buildPluginMenu(menu,
menuParent.getShell(), includeGetPluginsMenu);
}
});
return pluginsMenuItem;
}
public static MenuItem createWindowMenuItem(Menu menuParent) {
return createTopLevelMenuItem(menuParent, MENU_ID_WINDOW);
}
public static MenuItem createHelpMenuItem(Menu menuParent) {
return createTopLevelMenuItem(menuParent, MENU_ID_HELP);
}
public static MenuItem addCreateMenuItem(Menu menuParent) {
MenuItem file_create = addMenuItem(menuParent, MENU_ID_CREATE,
new Listener() {
public void handleEvent(Event e) {
new NewTorrentWizard(e.display);
}
});
return file_create;
}
public static MenuItem createOpenMenuItem(Menu menuParent) {
return createTopLevelMenuItem(menuParent, MENU_ID_OPEN);
}
public static MenuItem addLogsViewMenuItem(Menu menuParent) {
return createTopLevelMenuItem(menuParent, MENU_ID_LOG_VIEWS);
}
public static MenuItem addOpenTorrentMenuItem(Menu menuParent) {
return addMenuItem(menuParent, MENU_ID_OPEN_TORRENT, new Listener() {
public void handleEvent(Event e) {
TorrentOpener.openTorrentWindow();
}
});
}
public static MenuItem addOpenTorrentForTrackingMenuItem(Menu menuParent) {
MenuItem file_new_torrent_for_tracking = addMenuItem(menuParent,
MENU_ID_OPEN_TORRENT_FOR_TRACKING, new Listener() {
public void handleEvent(Event e) {
TorrentOpener.openTorrentTrackingOnly();
}
});
return file_new_torrent_for_tracking;
}
public static MenuItem addSearchMenuItem(Menu menuParent) {
MenuItem item = addMenuItem(menuParent,
"Button.search", new Listener() {
public void handleEvent(Event e) {
UIFunctionsManagerSWT.getUIFunctionsSWT().promptForSearch();
}
});
return item;
}
public static MenuItem addOpenVuzeFileMenuItem(final Menu menuParent) {
return addMenuItem(menuParent, MENU_ID_OPEN_VUZE_FILE, new Listener() {
public void handleEvent(Event e) {
Display display = menuParent.getDisplay();
display.asyncExec(new AERunnable() {
public void runSupport() {
FileDialog dialog = new FileDialog(menuParent.getShell(),
SWT.SYSTEM_MODAL | SWT.OPEN);
dialog.setFilterPath(TorrentOpener.getFilterPathData());
dialog.setText(MessageText.getString("MainWindow.dialog.select.vuze.file"));
dialog.setFilterExtensions(new String[] {
"*.vuze",
"*.vuz",
Constants.FILE_WILDCARD
});
dialog.setFilterNames(new String[] {
"*.vuze",
"*.vuz",
Constants.FILE_WILDCARD
});
String path = TorrentOpener.setFilterPathData(dialog.open());
if (path != null) {
VuzeFileHandler vfh = VuzeFileHandler.getSingleton();
if (vfh.loadAndHandleVuzeFile(path,
VuzeFileComponent.COMP_TYPE_NONE) == null) {
TorrentOpener.openTorrent(path);
}
}
}
});
}
});
}
public static MenuItem createShareMenuItem(Menu menuParent) {
MenuItem file_share = createTopLevelMenuItem(menuParent, MENU_ID_SHARE);
return file_share;
}
public static MenuItem addShareFileMenuItem(final Menu menuParent) {
MenuItem file_share_file = addMenuItem(menuParent, MENU_ID_SHARE_FILE,
new Listener() {
public void handleEvent(Event e) {
ShareUtils.shareFile(menuParent.getShell());
}
});
return file_share_file;
}
public static MenuItem addShareFolderMenuItem(final Menu menuParent) {
MenuItem file_share_dir = addMenuItem(menuParent, MENU_ID_SHARE_DIR,
new Listener() {
public void handleEvent(Event e) {
ShareUtils.shareDir(menuParent.getShell());
}
});
return file_share_dir;
}
public static MenuItem addShareFolderContentMenuItem(final Menu menuParent) {
MenuItem file_share_dircontents = addMenuItem(menuParent,
MENU_ID_SHARE_DIR_CONTENT, new Listener() {
public void handleEvent(Event e) {
ShareUtils.shareDirContents(menuParent.getShell(), false);
}
});
return file_share_dircontents;
}
public static MenuItem addShareFolderContentRecursiveMenuItem(
final Menu menuParent) {
MenuItem file_share_dircontents_rec = addMenuItem(menuParent,
MENU_ID_SHARE_DIR_CONTENT_RECURSE, new Listener() {
public void handleEvent(Event e) {
ShareUtils.shareDirContents(menuParent.getShell(), true);
}
});
return file_share_dircontents_rec;
}
public static MenuItem addImportMenuItem(Menu menuParent) {
MenuItem file_import = addMenuItem(menuParent, MENU_ID_IMPORT,
new Listener() {
public void handleEvent(Event e) {
new ImportTorrentWizard();
}
});
return file_import;
}
public static MenuItem addExportMenuItem(Menu menuParent) {
MenuItem file_export = addMenuItem(menuParent, MENU_ID_EXPORT,
new Listener() {
public void handleEvent(Event e) {
new ExportTorrentWizard();
}
});
return file_export;
}
public static MenuItem addCloseWindowMenuItem(final Menu menuParent) {
MenuItem closeWindow = addMenuItem(menuParent, MENU_ID_WINDOW_CLOSE,
new Listener() {
public void handleEvent(Event event) {
Shell shell = menuParent.getShell();
if (shell != null && !shell.isDisposed()) {
menuParent.getShell().close();
}
}
});
return closeWindow;
}
public static MenuItem addCloseTabMenuItem(Menu menu) {
final MenuItem menuItem = addMenuItem(menu, MENU_ID_CLOSE_TAB, new Listener() {
public void handleEvent(Event event) {
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
if (mdi != null) {
MdiEntry currentEntry = mdi.getCurrentEntry();
if (currentEntry != null && currentEntry.isCloseable()) {
mdi.closeEntry(currentEntry.getId());
}
}
}
});
menu.addMenuListener(new MenuListener() {
public void menuShown(MenuEvent e) {
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
if (mdi != null) {
MdiEntry currentEntry = mdi.getCurrentEntry();
if (currentEntry != null && currentEntry.isCloseable()) {
menuItem.setEnabled(true);
return;
}
}
menuItem.setEnabled(false);
}
public void menuHidden(MenuEvent e) {
}
});
return menuItem;
}
public static MenuItem addCloseDetailsMenuItem(Menu menu) {
final MenuItem item = addMenuItem(menu, MENU_ID_CLOSE_ALL_DETAIL,
new Listener() {
public void handleEvent(Event e) {
UIFunctionsManagerSWT.getUIFunctionsSWT().closeAllDetails();
}
});
Listener enableHandler = new Listener() {
public void handleEvent(Event event) {
if (true == MenuFactory.isEnabledForCurrentMode(item)) {
if (false == item.isDisposed() && false == event.widget.isDisposed()) {
boolean hasDetails = UIFunctionsManagerSWT.getUIFunctionsSWT().hasDetailViews();
item.setEnabled(hasDetails);
}
}
}
};
menu.addListener(SWT.Show, enableHandler);
return item;
}
public static MenuItem addCloseDownloadBarsToMenu(Menu menu) {
final MenuItem item = addMenuItem(menu, MENU_ID_CLOSE_ALL_DL_BARS,
new Listener() {
public void handleEvent(Event e) {
MiniBarManager.getManager().closeAll();
}
});
Listener enableHandler = new Listener() {
public void handleEvent(Event event) {
if (false == item.isDisposed()) {
item.setEnabled(false == MiniBarManager.getManager().getShellManager().isEmpty());
}
}
};
menu.addListener(SWT.Show, enableHandler);
// shell.addListener(SWT.FocusIn, enableHandler);
return item;
}
public static MenuItem addRestartMenuItem(Menu menuParent) {
MenuItem file_restart = new MenuItem(menuParent, SWT.NULL);
Messages.setLanguageText(file_restart, MENU_ID_RESTART); //$NON-NLS-1$
file_restart.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
UIFunctionsManagerSWT.getUIFunctionsSWT().dispose(true, false);
}
});
return file_restart;
}
public static MenuItem addExitMenuItem(Menu menuParent) {
final MenuItem file_exit = new MenuItem(menuParent, SWT.NULL);
if (!COConfigurationManager.getBooleanParameter("Enable System Tray")
|| !COConfigurationManager.getBooleanParameter("Close To Tray")) {
KeyBindings.setAccelerator(file_exit, MENU_ID_EXIT);
}
Messages.setLanguageText(file_exit, MENU_ID_EXIT); //$NON-NLS-1$
file_exit.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
UIFunctionsManagerSWT.getUIFunctionsSWT().dispose(false, false);
}
});
// let platform decide
ParameterListener paramListener = new ParameterListener() {
public void parameterChanged(String parameterName) {
if (COConfigurationManager.getBooleanParameter("Enable System Tray")
&& COConfigurationManager.getBooleanParameter("Close To Tray")) {
KeyBindings.removeAccelerator(file_exit, MENU_ID_EXIT);
} else {
KeyBindings.setAccelerator(file_exit, MENU_ID_EXIT);
}
}
};
COConfigurationManager.addParameterListener("Enable System Tray",
paramListener);
COConfigurationManager.addParameterListener("Close To Tray", paramListener);
return file_exit;
}
public static MenuItem addStartAllMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_START_ALL_TRANSFERS,
new ListenerNeedingCoreRunning() {
public void handleEvent(AzureusCore core, Event e) {
core.getGlobalManager().startAllDownloads();
/*
* KN: Not sure why we can not use the call below as opposed to the line above
* which was the exiting code
*/
// ManagerUtils.asyncStartAll();
}
});
}
public static MenuItem addStopAllMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_STOP_ALL_TRANSFERS, new Listener() {
public void handleEvent(Event event) {
ManagerUtils.asyncStopAll();
}
});
}
public static MenuItem addPauseMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_PAUSE_TRANSFERS, new Listener() {
public void handleEvent(Event event) {
ManagerUtils.asyncPause();
}
});
}
public static MenuItem addResumeMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_RESUME_TRANSFERS, new Listener() {
public void handleEvent(Event event) {
ManagerUtils.asyncResume();
}
});
}
public static MenuItem addMyTorrentsMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_MY_TORRENTS, new Listener() {
public void handleEvent(Event e) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.openView(UIFunctions.VIEW_MYTORRENTS, null);
}
}
});
}
public static MenuItem addAllPeersMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_ALL_PEERS, new Listener() {
public void handleEvent(Event e) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.openView(UIFunctions.VIEW_ALLPEERS, null);
}
}
});
}
public static MenuItem addClientStatsMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_CLIENT_STATS, new Listener() {
public void handleEvent(Event e) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.openView(UIFunctions.VIEW_PEERS_STATS, null);
}
}
});
}
public static MenuItem addDeviceManagerMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_DEVICEMANAGER, new Listener() {
public void handleEvent(Event e) {
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_SECTION_DEVICES);
}
});
}
public static MenuItem addSubscriptionMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_SUBSCRIPTIONS, new Listener() {
public void handleEvent(Event e) {
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_HEADER_SUBSCRIPTIONS);
}
});
}
public static MenuItem addMyTrackerMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_MY_TRACKERS, new Listener() {
public void handleEvent(Event e) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.openView(UIFunctions.VIEW_MYTRACKER, null);
}
}
});
}
public static MenuItem addMySharesMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_MY_SHARES, new Listener() {
public void handleEvent(Event e) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.openView(UIFunctions.VIEW_MYSHARES, null);
}
}
});
}
public static MenuItem addViewToolbarMenuItem(Menu menu) {
final MenuItem item = addMenuItem(menu, SWT.CHECK, MENU_ID_TOOLBAR,
new Listener() {
public void handleEvent(Event e) {
UIFunctionsSWT uiFunctions = getUIFunctionSWT();
if (null != uiFunctions) {
IMainWindow mainWindow = uiFunctions.getMainWindow();
boolean isToolbarVisible = mainWindow.isVisible(IMainWindow.WINDOW_ELEMENT_TOOLBAR);
mainWindow.setVisible(IMainWindow.WINDOW_ELEMENT_TOOLBAR,
!isToolbarVisible);
}
}
});
final ParameterListener listener = new ParameterListener() {
public void parameterChanged(String parameterName) {
item.setSelection(COConfigurationManager.getBooleanParameter(parameterName));
}
};
COConfigurationManager.addAndFireParameterListener("IconBar.enabled",
listener);
item.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
COConfigurationManager.removeParameterListener("IconBar.enabled",
listener);
}
});
return item;
}
public static MenuItem addTransferBarToMenu(final Menu menu) {
final MenuItem item = addMenuItem(menu, SWT.CHECK, MENU_ID_TRANSFER_BAR,
new ListenerNeedingCoreRunning() {
public void handleEvent(AzureusCore core, Event e) {
if (AllTransfersBar.getManager().isOpen(
core.getGlobalManager())) {
AllTransfersBar.close(core.getGlobalManager());
} else {
AllTransfersBar.open(core.getGlobalManager(),
menu.getShell());
}
}
});
item.setSelection(!MiniBarManager.getManager().getShellManager().isEmpty());
menu.addListener(SWT.Show, new Listener() {
public void handleEvent(Event event) {
if (item.isDisposed()) {
menu.removeListener(SWT.Show, this);
} else {
item.setSelection(!MiniBarManager.getManager().getShellManager().isEmpty());
}
}
});
return item;
}
public static MenuItem addBlockedIPsMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_IP_FILTER, new ListenerNeedingCoreRunning() {
public void handleEvent(AzureusCore core, Event e) {
BlockedIpsWindow.showBlockedIps(core,
getUIFunctionSWT().getMainShell());
}
});
}
public static MenuItem addConsoleMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_CONSOLE, new Listener() {
public void handleEvent(Event e) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.openView(UIFunctions.VIEW_CONSOLE, null);
}
}
});
}
public static MenuItem addStatisticsMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_STATS, new Listener() {
public void handleEvent(Event e) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.openView(UIFunctions.VIEW_STATS, null);
}
}
});
}
public static MenuItem addNatTestMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_NAT_TEST, new Listener() {
public void handleEvent(Event e) {
new NatTestWindow();
}
});
}
public static MenuItem addSpeedTestMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_SPEED_TEST, new Listener() {
public void handleEvent(Event e) {
CoreWaiterSWT.waitForCoreRunning(new AzureusCoreRunningListener() {
public void azureusCoreRunning(AzureusCore core) {
new SpeedTestWizard();
}
});
}
});
}
public static MenuItem addConfigWizardMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_CONFIGURE, new Listener() {
public void handleEvent(Event e) {
new ConfigureWizard(false,ConfigureWizard.WIZARD_MODE_FULL);
}
});
}
public static MenuItem addOptionsMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_OPTIONS, new Listener() {
public void handleEvent(Event e) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.openView(UIFunctions.VIEW_CONFIG, null);
}
}
});
}
public static MenuItem addMinimizeWindowMenuItem(Menu menu) {
final Shell shell = menu.getShell();
final MenuItem item = addMenuItem(menu, MENU_ID_WINDOW_MINIMIZE,
new Listener() {
public void handleEvent(Event event) {
if (null == shell || shell.isDisposed()) {
event.doit = false;
return;
}
shell.setMinimized(true);
}
});
Listener enableHandler = new Listener() {
public void handleEvent(Event event) {
if (null == shell || true == shell.isDisposed()
|| true == item.isDisposed()) {
event.doit = false;
return;
}
if (((shell.getStyle() & SWT.MIN) != 0)) {
item.setEnabled(false == shell.getMinimized());
} else {
item.setEnabled(false);
}
}
};
menu.addListener(SWT.Show, enableHandler);
shell.addListener(SWT.FocusIn, enableHandler);
shell.addListener(SWT.Iconify, enableHandler);
shell.addListener(SWT.Deiconify, enableHandler);
return item;
}
public static MenuItem addBringAllToFrontMenuItem(Menu menu) {
final MenuItem item = addMenuItem(menu, MENU_ID_WINDOW_ALL_TO_FRONT,
new Listener() {
public void handleEvent(Event event) {
Iterator iter = ShellManager.sharedManager().getWindows();
while (iter.hasNext()) {
Shell shell = (Shell) iter.next();
if (!shell.isDisposed() && !shell.getMinimized())
shell.open();
}
}
});
final Listener enableHandler = new Listener() {
public void handleEvent(Event event) {
if (item.isDisposed()) {
return;
}
Iterator iter = ShellManager.sharedManager().getWindows();
boolean hasNonMaximizedShell = false;
while (iter.hasNext()) {
Shell shell = (Shell) iter.next();
if (false == shell.isDisposed() && false == shell.getMinimized()) {
hasNonMaximizedShell = true;
break;
}
}
item.setEnabled(hasNonMaximizedShell);
}
};
menu.addListener(SWT.Show, enableHandler);
menu.getShell().addListener(SWT.FocusIn, enableHandler);
ShellManager.sharedManager().addWindowAddedListener(enableHandler);
ShellManager.sharedManager().addWindowRemovedListener(enableHandler);
item.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
ShellManager.sharedManager().removeWindowAddedListener(enableHandler);
ShellManager.sharedManager().removeWindowRemovedListener(enableHandler);
}
});
return item;
}
/**
* Appends the list of opened interactive windows to the bottom of the specified shell menu
* @param menuParent The shell menu
* @param shell
*/
public static void appendWindowMenuItems(final Menu menuParent) {
final Shell shell = menuParent.getShell();
final int numTopItems = menuParent.getItemCount();
Listener rebuild = new Listener() {
public void handleEvent(Event event) {
try {
if (menuParent.isDisposed() || shell.isDisposed())
return;
final int size = ShellManager.sharedManager().getSize();
if (size == menuParent.getItemCount() - numTopItems) {
for (int i = numTopItems; i < menuParent.getItemCount(); i++) {
final MenuItem item = menuParent.getItem(i);
item.setSelection(item.getData() == shell);
}
return;
}
for (int i = numTopItems; i < menuParent.getItemCount();)
menuParent.getItem(i).dispose();
Iterator iter = ShellManager.sharedManager().getWindows();
for (int i = 0; i < size; i++) {
final Shell sh = (Shell) iter.next();
if (sh.isDisposed() || sh.getText().length() == 0)
continue;
final MenuItem item = new MenuItem(menuParent, SWT.CHECK);
item.setText(sh.getText());
item.setSelection(shell == sh);
item.setData(sh);
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if (event.widget.isDisposed() || sh.isDisposed())
return;
if (sh.getMinimized())
sh.setMinimized(false);
sh.open();
}
});
}
} catch (Exception e) {
Logger.log(new LogEvent(LogIDs.GUI, "rebuild menu error", e));
}
}
};
ShellManager.sharedManager().addWindowAddedListener(rebuild);
ShellManager.sharedManager().addWindowRemovedListener(rebuild);
shell.addListener(SWT.FocusIn, rebuild);
menuParent.addListener(SWT.Show, rebuild);
}
public static MenuItem addZoomWindowMenuItem(Menu menuParent) {
final Shell shell = menuParent.getShell();
final MenuItem item = addMenuItem(menuParent, MENU_ID_WINDOW_ZOOM,
new Listener() {
public void handleEvent(Event event) {
if (shell.isDisposed()) {
event.doit = false;
return;
}
shell.setMaximized(!shell.getMaximized());
}
});
Listener enableHandler = new Listener() {
public void handleEvent(Event event) {
if ( !shell.isDisposed() && !item.isDisposed()) {
if (false == Constants.isOSX) {
if (true == shell.getMaximized()) {
Messages.setLanguageText(
item,
MessageText.resolveLocalizationKey(MENU_ID_WINDOW_ZOOM_RESTORE));
} else {
Messages.setLanguageText(
item,
MessageText.resolveLocalizationKey(MENU_ID_WINDOW_ZOOM_MAXIMIZE));
}
}
if (((shell.getStyle() & SWT.MAX) != 0)) {
item.setEnabled(false == shell.getMinimized());
} else {
item.setEnabled(false);
}
}
}
};
menuParent.addListener(SWT.Show, enableHandler);
shell.addListener(SWT.FocusIn, enableHandler);
shell.addListener(SWT.Iconify, enableHandler);
shell.addListener(SWT.Deiconify, enableHandler);
return item;
}
public static MenuItem addAboutMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_ABOUT, new Listener() {
public void handleEvent(Event e) {
AboutWindow.show();
}
});
}
public static MenuItem addHealthMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_HEALTH, new Listener() {
public void handleEvent(Event e) {
HealthHelpWindow.show(getDisplay());
}
});
}
public static MenuItem addWhatsNewMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_WHATS_NEW, new Listener() {
public void handleEvent(Event e) {
Utils.launch("http://plugins.vuze.com/changelog.php?version="
+ Constants.AZUREUS_VERSION);
}
});
}
public static MenuItem addWikiMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_COMMUNITY_WIKI, new Listener() {
public void handleEvent(Event e) {
Utils.launch(Constants.AZUREUS_WIKI);
}
});
}
public static MenuItem addReleaseNotesMenuItem(final Menu menu) {
return addMenuItem(menu, MENU_ID_RELEASE_NOTES, new Listener() {
public void handleEvent(Event e) {
new WelcomeWindow(menu.getShell());
}
});
}
public static MenuItem addHelpSupportMenuItem(Menu menu, final String support_url ) {
return addMenuItem(menu, MENU_ID_HELP_SUPPORT, new Listener() {
public void handleEvent(Event e) {
Utils.launch( support_url );
}
});
}
public static MenuItem addDonationMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_DONATE, new Listener() {
public void handleEvent(Event e) {
DonationWindow.open(true, "menu");
}
});
}
public static MenuItem addGetPluginsMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_PLUGINS_HELP, new Listener() {
public void handleEvent(Event e) {
Utils.launch("http://plugins.vuze.com/plugin_list.php");
//MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
//mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_SECTION_ABOUTPLUGINS);
}
});
}
public static MenuItem addDebugHelpMenuItem(Menu menu) {
return addMenuItem(menu, MENU_ID_DEBUG_HELP, new Listener() {
public void handleEvent(Event e) {
UIDebugGenerator.generate(Constants.APP_NAME + " "
+ Constants.AZUREUS_VERSION, "Generated via Help Menu");
}
});
}
public static MenuItem addCheckUpdateMenuItem(final Menu menu) {
return addMenuItem(menu, MENU_ID_UPDATE_CHECK, new ListenerNeedingCoreRunning() {
public void handleEvent(AzureusCore core, Event e) {
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (uiFunctions != null) {
uiFunctions.bringToFront();
}
UpdateMonitor.getSingleton(core).performCheck(true, false, false,
new UpdateCheckInstanceListener() {
public void cancelled(UpdateCheckInstance instance) {
}
public void complete(UpdateCheckInstance instance) {
Update[] updates = instance.getUpdates();
boolean hasUpdates = false;
for (Update update : updates) {
if (update.getDownloaders().length > 0) {
hasUpdates = true;
break;
}
}
if (!hasUpdates) {
MessageBoxShell mb = new MessageBoxShell(
SWT.ICON_INFORMATION | SWT.OK,
"window.update.noupdates", (String[]) null);
mb.open(null);
}
}
});
}
});
}
public static MenuItem addBetaMenuItem(Menu menuParent) {
final MenuItem menuItem = addMenuItem(menuParent, MENU_ID_BETA_PROG,
new Listener() {
public void handleEvent(Event e) {
new BetaWizard();
}
});
COConfigurationManager.addAndFireParameterListener(
"Beta Programme Enabled", new ParameterListener() {
public void parameterChanged(String parameterName) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if ( menuItem.isDisposed()){
return;
}
boolean enabled = COConfigurationManager.getBooleanParameter("Beta Programme Enabled");
Messages.setLanguageText(
menuItem,
MessageText.resolveLocalizationKey(MENU_ID_BETA_PROG
+ (enabled ? ".off" : ".on")));
}
});
}
});
return menuItem;
}
public static MenuItem addPluginInstallMenuItem(Menu menuParent) {
return addMenuItem(menuParent, MENU_ID_PLUGINS_INSTALL,
new Listener() {
public void handleEvent(Event e) {
new InstallPluginWizard();
}
});
}
public static MenuItem addPluginUnInstallMenuItem(Menu menuParent) {
return addMenuItem(menuParent, MENU_ID_PLUGINS_UNINSTALL,
new Listener() {
public void handleEvent(Event e) {
new UnInstallPluginWizard(getDisplay());
}
});
}
/**
* Creates a menu item that is simply a label; it does nothing is selected
* @param menu
* @param localizationKey
* @return
*/
public static final MenuItem addLabelMenuItem(Menu menu,
String localizationKey) {
MenuItem item = new MenuItem(menu, SWT.NULL);
Messages.setLanguageText(item, localizationKey);
item.setEnabled(false);
return item;
}
//==========================
public static MenuItem addSeparatorMenuItem(Menu menuParent) {
return new MenuItem(menuParent, SWT.SEPARATOR);
}
public static MenuItem createTopLevelMenuItem(Menu menuParent,
String localizationKey) {
Menu menu = new Menu(menuParent.getShell(), SWT.DROP_DOWN);
MenuItem menuItem = new MenuItem(menuParent, SWT.CASCADE);
Messages.setLanguageText(menuItem, localizationKey);
menuItem.setMenu(menu);
/*
* A top level menu and its menu item has the same ID; this is used to locate them at runtime
*/
menu.setData(KEY_MENU_ID, localizationKey);
menuItem.setData(KEY_MENU_ID, localizationKey);
return menuItem;
}
public static final MenuItem addMenuItem(Menu menu, String localizationKey,
Listener selListener) {
return addMenuItem(menu, localizationKey, selListener, SWT.NONE);
}
public static final MenuItem addMenuItem(Menu menu, String localizationKey,
Listener selListener, int style) {
MenuItem menuItem = new MenuItem(menu, style);
Messages.setLanguageText(menuItem,
MessageText.resolveLocalizationKey(localizationKey));
KeyBindings.setAccelerator(menuItem,
MessageText.resolveAcceleratorKey(localizationKey));
if (null != selListener) {
menuItem.addListener(SWT.Selection, selListener);
}
/*
* Using the localizationKey as the id for the menu item; this can be used to locate it at runtime
* using .KN: missing method pointers
*/
menuItem.setData(KEY_MENU_ID, localizationKey);
return menuItem;
}
public static final MenuItem addMenuItem(Menu menu, int style,
String localizationKey, Listener selListener) {
return addMenuItem(menu, style, -1, localizationKey, selListener);
}
public static final MenuItem addMenuItem(Menu menu, int style, int index,
String localizationKey, Listener selListener) {
if (index < 0 || index > menu.getItemCount()) {
index = menu.getItemCount();
}
MenuItem menuItem = new MenuItem(menu, style, index);
Messages.setLanguageText(menuItem, localizationKey);
KeyBindings.setAccelerator(menuItem, localizationKey);
menuItem.addListener(SWT.Selection, selListener);
/*
* Using the localizationKey as the id for the menu item; this can be used to locate it at runtime
* using .KN: missing method pointers
*/
menuItem.setData(KEY_MENU_ID, localizationKey);
return menuItem;
}
private static UIFunctionsSWT getUIFunctionSWT() {
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (null != uiFunctions) {
return uiFunctions;
}
throw new IllegalStateException(
"No instance of UIFunctionsSWT found; the UIFunctionsManager might not have been initialized properly");
}
private static Display getDisplay() {
return SWTThread.getInstance().getDisplay();
}
public static void updateMenuText(Object menu) {
if (menu == null)
return;
if (menu instanceof Menu) {
MenuItem[] menus = ((Menu) menu).getItems();
for (int i = 0; i < menus.length; i++) {
updateMenuText(menus[i]);
}
} else if (menu instanceof MenuItem) {
MenuItem item = (MenuItem) menu;
if (item.getData(KEY_MENU_ID) instanceof String) {
String localizationKey = (String) item.getData(KEY_MENU_ID);
item.setText(MessageText.getString(localizationKey));
KeyBindings.setAccelerator(item,
MessageText.resolveAcceleratorKey(localizationKey));
updateMenuText(item.getMenu());
} else {
Messages.updateLanguageForControl(item);
}
}
}
public static void performOneTimeDisable(MenuItem item,
boolean affectsChildMenuItems) {
item.setEnabled(false);
if (affectsChildMenuItems) {
Menu childMenu = item.getMenu();
if (childMenu == null)
return;
for (int i = 0; i < childMenu.getItemCount(); i++) {
childMenu.getItem(i).setEnabled(false);
}
}
}
/**
* Find and return the menu with the given id starting from the given menu
*
* @param menuToStartWith
* @param idToMatch any of the menu keys listed in {@link org.gudy.azureus2.ui.swt.mainwindow.IMenuConstants}
* @return may return <code>null</code> if not found
*/
public static Menu findMenu(Menu menuToStartWith, String idToMatch) {
/*
* This is a recursive method; it will start at the given menuToStartWith
* and recursively traverse to all its sub menus until a matching
* menu is found or until it has touched all sub menus
*/
if (null == menuToStartWith || true == menuToStartWith.isDisposed()
|| null == idToMatch || idToMatch.length() < 1) {
return null;
}
/*
* The given menuToStartWith may be the one we're looking for
*/
if (true == idToMatch.equals(getID(menuToStartWith))) {
return menuToStartWith;
}
MenuItem[] items = menuToStartWith.getItems();
/*
* Go deeper into each child to try and find it
*/
for (int i = 0; i < items.length; i++) {
MenuItem item = items[i];
Menu menuToFind = findMenu(item.getMenu(), idToMatch);
if (null != menuToFind) {
return menuToFind;
}
}
return null;
}
/**
* Find and return the menu item with the given id starting from the given menu
*
* @param menuToStartWith
* @param idToMatch any of the menu keys listed in {@link org.gudy.azureus2.ui.swt.mainwindow.IMenuConstants}
* @return may return <code>null</code> if not found
*/
public static MenuItem findMenuItem(Menu menuToStartWith, String idToMatch) {
return findMenuItem(menuToStartWith, idToMatch, true);
}
public static MenuItem findMenuItem(Menu menuToStartWith, String idToMatch, boolean deep) {
/*
* This is a recursive method; it will start at the given menuToStartWith
* and recursively traverse to all its sub menus until a matching
* menu item is found or until it has touched all existing menu items
*/
if (null == menuToStartWith || true == menuToStartWith.isDisposed()
|| null == idToMatch || idToMatch.length() < 1) {
return null;
}
MenuItem[] items = menuToStartWith.getItems();
for (int i = 0; i < items.length; i++) {
MenuItem item = items[i];
if (true == idToMatch.equals(getID(item))) {
return item;
}
if (deep) {
/*
* Go deeper into each child to try and find it
*/
MenuItem menuItemToFind = findMenuItem(item.getMenu(), idToMatch);
if (null != menuItemToFind) {
return menuItemToFind;
}
}
}
return null;
}
private static String getID(Widget widget) {
if (null != widget && false == widget.isDisposed()) {
Object id = widget.getData(KEY_MENU_ID);
if (null != id) {
return id.toString();
}
}
return "";
}
public static void setEnablementKeys(Widget widget, int keys) {
if (null != widget && false == widget.isDisposed()) {
widget.setData(KEY_ENABLEMENT, new Integer(keys));
}
}
public static int getEnablementKeys(Widget widget) {
if (null != widget && false == widget.isDisposed()) {
Object keys = widget.getData(KEY_ENABLEMENT);
if (keys instanceof Integer) {
return ((Integer) keys).intValue();
}
}
return -1;
}
/**
* Updates the enabled state of the given menu and all its applicable children
* <p><b>NOTE:</b> This method currently iterates through the menu hierarchy to
* set the enablement which may be inefficient since most menus do not have this flag set;
* it may be desirable to employ a map of only the effected menus for efficient direct
* access to them</p>
* @param menuToStartWith
*/
public static void updateEnabledStates(Menu menuToStartWith) {
/*
* This is a recursive method; it will start at the given menuToStartWith
* and recursively traverse to all its sub menus until a matching
* menu item is found or until it has touched all existing menu items
*/
if (null == menuToStartWith || true == menuToStartWith.isDisposed()) {
return;
}
/*
* If the given menu itself is disabled then just return since
* its menu items can not be seen anyway
*/
if (false == setEnablement(menuToStartWith)) {
return;
}
MenuItem[] items = menuToStartWith.getItems();
for (int i = 0; i < items.length; i++) {
MenuItem item = items[i];
/*
* If the current menu item is disabled then just return since
* its children items can not be seen anyway
*/
if (false == setEnablement(item)) {
continue;
}
/*
* Go deeper into the children items and set their enablement
*/
updateEnabledStates(item.getMenu());
}
}
/**
* Sets whether the given widget is enabled or not based on the value of the
* KEY_ENABLEMENT object data set into the given widget.
* @param widget
* @return
*/
public static boolean setEnablement(Widget widget) {
if (null != widget && false == widget.isDisposed()) {
boolean isEnabled = isEnabledForCurrentMode(widget);
if (widget instanceof MenuItem) {
((MenuItem) widget).setEnabled(isEnabled);
} else if (widget instanceof Menu) {
((Menu) widget).setEnabled(isEnabled);
}
return isEnabled;
}
return false;
}
/**
* Returns whether the given widget should be enabled for the current mode;
* current mode can be az2, az3, or az3 advanced.
* @param widget
* @return
*/
public static boolean isEnabledForCurrentMode(Widget widget) {
int keys = getEnablementKeys(widget);
if (keys <= 0) {
return true;
} else if (true == isAZ3) {
return ((keys & FOR_AZ3) != 0);
} else {
return ((keys & FOR_AZ2) != 0);
}
}
private static final boolean DEBUG_SET_FOREGROUND = System.getProperty("debug.setforeground") != null;
private static TableRow wrapAsRow(final Object o, final String table_name) {
return new TableRow() {
public Object getDataSource() {return o;}
public String getTableID() {return table_name;}
private void notSupported() {
throw new RuntimeException("method is not supported - table row is a \"virtual\" one, only getDataSource and getTableID are supported.");
}
private void setForegroundDebug() {
if (DEBUG_SET_FOREGROUND) {
Debug.out("setForeground on fake TableRow");
}
}
// Everything below is unsupported.
public void setForeground(int red, int green, int blue) {setForegroundDebug(); notSupported();}
public void setForeground(int[] rgb) {setForegroundDebug(); notSupported();}
public void setForegroundToErrorColor() {setForegroundDebug(); notSupported();}
public boolean isValid() {notSupported(); return false;}
public TableCell getTableCell(String sColumnName) {notSupported(); return null;}
public boolean isSelected() {notSupported(); return false;}
public void addMouseListener(TableRowMouseListener listener) {notSupported();}
public void removeMouseListener(TableRowMouseListener listener) {notSupported();}
public Object getData(String id) {return null;}
public void setData(String id, Object data) {}
};
}
}