/*
* Created on 4 mai 2004
* Created by Olivier Chalouhi
*
* Copyright (C) 2004, 2005, 2006 Aelitis SAS, All rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* AELITIS, SAS au capital de 46,603.30 euros,
* 8 Alle Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package org.gudy.azureus2.ui.swt.mainwindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.SystemProperties;
import org.gudy.azureus2.ui.swt.Utils;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.mdi.MdiEntry;
import com.aelitis.azureus.ui.mdi.MultipleDocumentInterface;
/**
* @author Olivier Chalouhi
*/
public class MainMenu
implements IMainMenu
{
private Menu menuBar;
/**
* <p>Creates the main menu bar and attaches it to the given shell</p>
* @param shell A shell
*/
public MainMenu(Shell shell) {
createMenus(shell);
}
public void linkMenuBar(Shell parent) {
parent.setMenuBar(menuBar);
}
private void createMenus(final Shell parent) {
//The Main Menu
menuBar = new Menu(parent, SWT.BAR);
parent.setMenuBar(menuBar);
addFileMenu(parent);
/* ======= View, Transfers, Torrent, Tools menus =====
* hig compliance for OSX dictates that more granular actions are positioned farther
* on the right of the menu and more general actions are closer to the left
* NOTE: we keep the original menu order (for non-OSX) in-tact so as to not disturb existing non-OSX users
*/
if (Constants.isOSX) {
addViewMenu(parent);
addTransferMenu(parent);
addTorrentMenu(parent);
} else {
addTransferMenu(parent);
addTorrentMenu(parent);
addViewMenu(parent);
/*
* The Tools menu is only present on non-OSX systems
*/
addToolsMenu(parent);
}
addPluginsMenu(parent);
// ========== Windows menu (OSX only)================
if (true == Constants.isOSX) {
addWindowMenu(parent);
}
// =========== Debug menu (development only)=========
if (Constants.isCVSVersion()) {
DebugMenuHelper.createDebugMenuItem(menuBar);
}
addV2HelpMenu(parent);
/*
* Enabled/disable menus based on what ui mode we're in
* NOTE: This is largely superfluous here since all menu items in the classic UI
* are available at all time; this method is left here for completeness should we
* add dynamic behavior to the menu in the future.
*/
MenuFactory.updateEnabledStates(menuBar);
}
/**
* Creates the Window menu and all its children
* @param parent
*/
private void addWindowMenu(final Shell parent) {
MenuItem menu_window = MenuFactory.createWindowMenuItem(menuBar);
Menu windowMenu = menu_window.getMenu();
MenuFactory.addMinimizeWindowMenuItem(windowMenu);
MenuFactory.addZoomWindowMenuItem(windowMenu);
MenuFactory.addSeparatorMenuItem(windowMenu);
MenuFactory.addBlockedIPsMenuItem(windowMenu);
MenuFactory.addSeparatorMenuItem(windowMenu);
MenuFactory.addBringAllToFrontMenuItem(windowMenu);
MenuFactory.addSeparatorMenuItem(windowMenu);
MenuFactory.appendWindowMenuItems(windowMenu);
}
/**
* Creates the File menu and all its children
* @param parent
*/
private void addFileMenu(final Shell parent) {
MenuItem fileItem = MenuFactory.createFileMenuItem(menuBar);
Menu fileMenu = fileItem.getMenu();
MenuFactory.addCreateMenuItem(fileMenu);
MenuItem openMenuItem = MenuFactory.createOpenMenuItem(fileMenu);
Menu openSubMenu = openMenuItem.getMenu();
MenuFactory.addOpenTorrentMenuItem(openSubMenu);
MenuFactory.addOpenTorrentForTrackingMenuItem(openSubMenu);
MenuFactory.addOpenVuzeFileMenuItem(openSubMenu);
MenuItem shareMenuItem = MenuFactory.createShareMenuItem(fileMenu);
Menu shareSubMenu = shareMenuItem.getMenu();
MenuFactory.addShareFileMenuItem(shareSubMenu);
MenuFactory.addShareFolderMenuItem(shareSubMenu);
MenuFactory.addShareFolderContentMenuItem(shareSubMenu);
MenuFactory.addShareFolderContentRecursiveMenuItem(shareSubMenu);
MenuFactory.addSearchMenuItem(fileMenu);
MenuFactory.addSeparatorMenuItem(fileMenu);
MenuFactory.addImportMenuItem(fileMenu);
MenuFactory.addExportMenuItem(fileMenu);
MenuFactory.addSeparatorMenuItem(fileMenu);
MenuFactory.addCloseWindowMenuItem(fileMenu);
MenuFactory.addCloseTabMenuItem(fileMenu);
MenuFactory.addCloseDetailsMenuItem(fileMenu);
MenuFactory.addCloseDownloadBarsToMenu(fileMenu);
/*
* No need for restart and exit on OSX in the File menu since it is moved to the gobla application
* menu instead see org.gudy.azureus2.ui.swt.osx.CarbonUIEnhancer for detail about that menu
*/
if (!Utils.isCarbon) {
MenuFactory.addSeparatorMenuItem(fileMenu);
MenuFactory.addRestartMenuItem(fileMenu);
}
if (!Constants.isOSX) {
MenuFactory.addExitMenuItem(fileMenu);
}
}
/**
* Creates the Transfer menu and all its children
* @param parent
*/
private void addTransferMenu(final Shell parent) {
MenuFactory.createTransfersMenuItem(menuBar);
}
/**
* Creates the View menu and all its children
* @param parent
*/
private void addViewMenu(final Shell parent) {
try {
MenuItem viewItem = MenuFactory.createViewMenuItem(menuBar);
final Menu viewMenu = viewItem.getMenu();
viewMenu.addListener(SWT.Show, new Listener() {
public void handleEvent(Event event) {
Utils.disposeSWTObjects(viewMenu.getItems());
buildSimpleViewMenu(viewMenu);
}
});
} catch (Exception e) {
Debug.out("Error creating View Menu", e);
}
}
protected void buildSimpleViewMenu(final Menu viewMenu) {
try {
MenuFactory.addLabelMenuItem(viewMenu, "MainWindow.menu.view.show");
boolean enabled = COConfigurationManager.getBooleanParameter("Beta Programme Enabled");
if (enabled) {
indent(MenuFactory.addMenuItem(viewMenu, SWT.CHECK, "MainWindow.menu.view.beta",
new Listener() {
public void handleEvent(Event event) {
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
MdiEntry entry = mdi.createEntryFromSkinRef(null,
"BetaProgramme", "main.area.beta",
"{Sidebar.beta.title}", null, null,
true, "");
mdi.showEntry(entry);
}
}));
}
indent(MenuFactory.addMyTorrentsMenuItem(viewMenu));
indent(MenuFactory.addMyTrackerMenuItem(viewMenu));
indent(MenuFactory.addMySharesMenuItem(viewMenu));
indent(MenuFactory.addViewToolbarMenuItem(viewMenu));
indent(MenuFactory.addTransferBarToMenu(viewMenu));
indent(MenuFactory.addAllPeersMenuItem(viewMenu));
indent(MenuFactory.addClientStatsMenuItem(viewMenu));
//indent(MenuFactory.addDetailedListMenuItem(viewMenu));
//indent(MenuFactory.addDeviceManagerMenuItem(viewMenu));
//indent(MenuFactory.addSubscriptionMenuItem(viewMenu));
/*
* These 2 menus resides on the Tools menu on non-OSX platforms;
* since the Tools menu is not present in the OSX version these menus are added here to the View menu
*/
if (Constants.isOSX) {
indent(MenuFactory.addConsoleMenuItem(viewMenu));
indent(MenuFactory.addStatisticsMenuItem(viewMenu));
}
} catch (Exception e) {
Debug.out("Error creating View Menu", e);
}
}
/**
* Creates the Torrent menu and all its children
* @param parent
*/
private void addTorrentMenu(final Shell parent) {
/*
* The Torrents menu is now a user-configured option
*/
if (true == COConfigurationManager.getBooleanParameter("show_torrents_menu")) {
MenuFactory.createTorrentMenuItem(menuBar);
}
}
/**
* Creates the Tools menu and all its children
* @param parent
*/
private void addToolsMenu(final Shell parent) {
MenuItem item = MenuFactory.createToolsMenuItem(menuBar);
Menu toolsMenu = item.getMenu();
MenuFactory.addBlockedIPsMenuItem(toolsMenu);
MenuFactory.addConsoleMenuItem(toolsMenu);
MenuFactory.addStatisticsMenuItem(toolsMenu);
MenuFactory.addNatTestMenuItem(toolsMenu);
MenuFactory.addSpeedTestMenuItem(toolsMenu);
MenuFactory.addSeparatorMenuItem(toolsMenu);
MenuFactory.addConfigWizardMenuItem(toolsMenu);
MenuFactory.addOptionsMenuItem(toolsMenu);
}
/**
* Creates the Plugins menu and all its children
* @param parent
*/
private void addPluginsMenu(final Shell parent) {
/*
* NOTE: We are specifying that the Plugins menu be created WITHOUT the 'get plugins' menu item
* since that item is an addition only for the new Vuze menu
*/
MenuFactory.createPluginsMenuItem(menuBar, false);
}
/**
* Creates the Help menu and all its children
* @param parent
*/
private void addV2HelpMenu(final Shell parent) {
MenuItem helpItem = MenuFactory.createHelpMenuItem(menuBar);
Menu helpMenu = helpItem.getMenu();
if (false == Constants.isOSX) {
MenuFactory.addAboutMenuItem(helpMenu);
MenuFactory.addSeparatorMenuItem(helpMenu);
}
MenuFactory.addHealthMenuItem(helpMenu);
MenuFactory.addReleaseNotesMenuItem(helpMenu);
MenuFactory.addWhatsNewMenuItem(helpMenu);
MenuFactory.addWikiMenuItem(helpMenu);
MenuFactory.addGetPluginsMenuItem(helpMenu);
MenuFactory.addSeparatorMenuItem(helpMenu);
if (false == SystemProperties.isJavaWebStartInstance()) {
MenuFactory.addCheckUpdateMenuItem(helpMenu);
MenuFactory.addBetaMenuItem(helpMenu);
}
MenuFactory.addDonationMenuItem(helpMenu);
MenuFactory.addSeparatorMenuItem(helpMenu);
MenuFactory.addDebugHelpMenuItem(helpMenu);
}
private static final void indent(MenuItem item) {
item.setData("IndentItem", "YES");
item.setText(" " + item.getText());
}
public Menu getMenu(String id) {
if (true == IMenuConstants.MENU_ID_MENU_BAR.equals(id)) {
return menuBar;
}
return MenuFactory.findMenu(menuBar, id);
}
}