//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.rcp.ui;

import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
import org.eclipse.epf.authoring.ui.views.ViewHelper;
import org.eclipse.epf.rcp.ui.actions.NewWizardMenu;
import org.eclipse.epf.rcp.ui.actions.UIActionFactory;
import org.eclipse.epf.rcp.ui.actions.UIOpenPerspectiveDialogAction;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ContributionItemFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.ide.IDEActionFactory;
import org.eclipse.ui.ide.IIDEActionConstants;
import org.eclipse.ui.internal.provisional.application.IActionBarConfigurer2;

/**
 * Creates, adds and disposes the actions added to a workbench window.
 * 
 * @author Kelvin Low
 * @author Bingxue Xu
 * @author Phong Nguyen Le
 * @author Jinhua Xi
 * @since 1.0
 */
public class MainActionBarAdvisor extends ActionBarAdvisor {

	// All actions should be created in makeActions and referenced in the
	// fill methods. This ensures that the actions aren't recreated
	// when fillActionBars is called with FILL_PROXY.

	// File actions.
	protected IWorkbenchAction newAction;

	protected IWorkbenchAction closeAction;

	protected IWorkbenchAction closeAllAction;

	protected IWorkbenchAction saveAction;

	protected IWorkbenchAction saveAsAction;

	protected IWorkbenchAction saveAllAction;

	protected IWorkbenchAction revertAction;

	protected IWorkbenchAction moveAction;

	protected IWorkbenchAction renameAction;

	protected IWorkbenchAction refreshAction;

	protected IWorkbenchAction importAction;

	protected IWorkbenchAction exportAction;

	protected IWorkbenchAction propertiesAction;

	protected IWorkbenchAction exitAction;

	// Edit actions.
	protected IWorkbenchAction openElementAction;

	protected IWorkbenchAction undoAction;

	protected IWorkbenchAction redoAction;

	protected IWorkbenchAction cutAction;

	protected IWorkbenchAction copyAction;

	protected IWorkbenchAction pasteAction;

	protected IWorkbenchAction deleteAction;

	protected IWorkbenchAction selectAllAction;

	protected IWorkbenchAction findAction;

	// Navigate actions.
	protected IWorkbenchAction goIntoAction;

	protected IWorkbenchAction nextAction;

	protected IWorkbenchAction previousAction;

	protected IWorkbenchAction backAction;

	protected IWorkbenchAction forwardAction;

	// Window actions.
	protected IWorkbenchAction openNewWindowAction;

	protected IWorkbenchAction openPerspectiveDialogAction;

	protected IWorkbenchAction customizePerspectiveAction;

	protected IWorkbenchAction savePerspectiveAction;

	protected IWorkbenchAction resetPerspectiveAction;

	protected IWorkbenchAction closePerspectiveAction;

	protected IWorkbenchAction closeAllPerspectiveAction;

	protected IWorkbenchAction preferencesAction;

	// Window navigation actions.
	protected IWorkbenchAction nextEditorAction;

	protected IWorkbenchAction previousEditorAction;

	protected IWorkbenchAction nextPartAction;

	protected IWorkbenchAction previousPartAction;

	protected IWorkbenchAction nextPerspectiveAction;

	protected IWorkbenchAction previousPerspectiveAction;

	// Help actions.
	protected IWorkbenchAction welcomeAction;

	protected IWorkbenchAction helpContentsAction;

	protected IWorkbenchAction aboutAction;

	protected IWorkbenchAction newWizardDropDownAction;

	protected IWorkbenchAction lockToolBarAction;

	protected IWorkbenchAction editActionSetAction;

	protected MenuManager mainHelpMenu;

	protected MenuManager mainFileMenu;

	protected MenuManager internalMenu;

	protected IWorkbenchWindow window;

	/**
	 * Creates a new instance.
	 * 
	 * @param configurer
	 *            the action bar configurer
	 */
	public MainActionBarAdvisor(IActionBarConfigurer configurer) {
		super(configurer);
		window = configurer.getWindowConfigurer().getWindow();
	}

	/**
	 * Getd the workbench window.
	 * 
	 * @return the workbench window
	 */
	public IWorkbenchWindow getWindow() {
		return window;
	}

	/**
	 * @see org.eclipse.ui.application.ActionBarAdvisor#makeActions(final
	 *      IWorkbenchWindow window)
	 */
	protected void makeActions(final IWorkbenchWindow window) {
		if (PlatformUI.getWorkbench().isClosing())
			return;

		// Creates the actions and registers them. Registering is needed to
		// ensure that key bindings work. The corresponding commands key
		// bindings are defined in the plugin.xml file. Registering also
		// provides automatic disposal of the actions when the window is closed.

		newAction = ActionFactory.NEW.create(window);
		register(newAction);

		closeAction = ActionFactory.CLOSE.create(window);
		register(closeAction);

		closeAllAction = ActionFactory.CLOSE_ALL.create(window);
		register(closeAllAction);

		saveAction = ActionFactory.SAVE.create(window);
		register(saveAction);

		saveAsAction = ActionFactory.SAVE_AS.create(window);
		register(saveAsAction);

		saveAllAction = ActionFactory.SAVE_ALL.create(window);
		register(saveAllAction);

		revertAction = ActionFactory.REVERT.create(window);
		register(revertAction);

		moveAction = ActionFactory.MOVE.create(window);
		register(moveAction);

		renameAction = ActionFactory.RENAME.create(window);
		register(renameAction);

		refreshAction = ActionFactory.REFRESH.create(window);
		register(refreshAction);

		importAction = UIActionFactory.UI_IMPORT.create(window);
		PlatformUI.getWorkbench().getHelpSystem().setHelp(importAction,
				AuthoringUIHelpContexts.FILE_IMPORT_CONTEXT);
		register(importAction);

		exportAction = UIActionFactory.UI_EXPORT.create(window);
		PlatformUI.getWorkbench().getHelpSystem().setHelp(exportAction,
				AuthoringUIHelpContexts.FILE_EXPORT_CONTEXT);
		register(exportAction);

		propertiesAction = ActionFactory.PROPERTIES.create(window);
		register(propertiesAction);

		exitAction = ActionFactory.QUIT.create(window);
		register(exitAction);

		openElementAction = UIActionFactory.OPEN_ELEMENT.create(window);
		register(openElementAction);

		undoAction = ActionFactory.UNDO.create(window);
		register(undoAction);

		redoAction = ActionFactory.REDO.create(window);
		register(redoAction);

		cutAction = ActionFactory.CUT.create(window);
		register(cutAction);

		copyAction = ActionFactory.COPY.create(window);
		register(copyAction);

		pasteAction = ActionFactory.PASTE.create(window);
		register(pasteAction);

		deleteAction = ActionFactory.DELETE.create(window);
		register(deleteAction);

		selectAllAction = ActionFactory.SELECT_ALL.create(window);
		register(selectAllAction);

		findAction = ActionFactory.FIND.create(window);
		register(findAction);

		goIntoAction = ActionFactory.GO_INTO.create(window);
		register(goIntoAction);

		nextAction = ActionFactory.NEXT.create(window);
		register(nextAction);

		previousAction = ActionFactory.PREVIOUS.create(window);
		register(previousAction);

		backAction = ActionFactory.BACK.create(window);
		register(backAction);

		forwardAction = ActionFactory.FORWARD.create(window);
		register(forwardAction);

		openNewWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
		register(openNewWindowAction);

		nextEditorAction = ActionFactory.NEXT_EDITOR.create(window);
		register(nextEditorAction);

		previousEditorAction = ActionFactory.PREVIOUS_EDITOR.create(window);
		register(previousEditorAction);

		nextPartAction = ActionFactory.NEXT_PART.create(window);
		register(nextPartAction);

		previousPartAction = ActionFactory.PREVIOUS_PART.create(window);
		register(previousPartAction);

		nextPerspectiveAction = ActionFactory.NEXT_PERSPECTIVE.create(window);
		register(nextPerspectiveAction);

		previousPerspectiveAction = ActionFactory.PREVIOUS_PERSPECTIVE
				.create(window);
		register(previousPerspectiveAction);

		openPerspectiveDialogAction = createTNGOpenPerspectiveDialogAction(window);
		openPerspectiveDialogAction.setText(RCPUIResources.otherMenuItem_text);
		register(openPerspectiveDialogAction);

		customizePerspectiveAction = ActionFactory.EDIT_ACTION_SETS
				.create(window);
		register(customizePerspectiveAction);

		savePerspectiveAction = ActionFactory.SAVE_PERSPECTIVE.create(window);
		register(savePerspectiveAction);

		resetPerspectiveAction = ActionFactory.RESET_PERSPECTIVE.create(window);
		register(resetPerspectiveAction);

		closePerspectiveAction = ActionFactory.CLOSE_PERSPECTIVE.create(window);
		register(closePerspectiveAction);

		closeAllPerspectiveAction = ActionFactory.CLOSE_ALL_PERSPECTIVES
				.create(window);
		register(closeAllPerspectiveAction);

		preferencesAction = ActionFactory.PREFERENCES.create(window);
		register(preferencesAction);

		welcomeAction = UIActionFactory.SHOW_INTRO.create(window);
		register(welcomeAction);
		ImageDescriptor imgDes = RCPUIPlugin.getDefault().getImageDescriptor(
				"full/obj16/product.gif"); //$NON-NLS-1$
		welcomeAction.setImageDescriptor(imgDes);

		helpContentsAction = ActionFactory.HELP_CONTENTS.create(window);
		register(helpContentsAction);

		aboutAction = ActionFactory.ABOUT.create(window);
		register(aboutAction);

		// FIXME! Filter out Project... from the drop-down menu.
		newWizardDropDownAction = IDEActionFactory.NEW_WIZARD_DROP_DOWN
				.create(window);
		register(newWizardDropDownAction);

		lockToolBarAction = ActionFactory.LOCK_TOOL_BAR.create(window);
		register(lockToolBarAction);

		editActionSetAction = ActionFactory.EDIT_ACTION_SETS.create(window);
		register(editActionSetAction);
	}

	/**
	 * @see org.eclipse.ui.application.ActionBarAdvisor#fillMenuBar(IMenuManager
	 *      menuBar)
	 */
	protected void fillMenuBar(IMenuManager menuBar) {
		if (PlatformUI.getWorkbench().isClosing())
			return;
		mainFileMenu = createFileMenu(menuBar);
		menuBar.add(mainFileMenu);
		menuBar.add(createEditMenu(menuBar));

		IMenuManager navManager = createNavigateMenu(menuBar);
		menuBar.add(navManager);
		navManager.setVisible(false);

		menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
		menuBar.add(createWindowMenu(menuBar));

		mainHelpMenu = createHelpMenu(menuBar);
		menuBar.add(mainHelpMenu);
	}

	/**
	 * Gets the File menu manager.
	 */
	public MenuManager getFileMenuManager() {
		return mainFileMenu;
	}

	/**
	 * Gets the Help menu manager.
	 */
	public MenuManager getHelpMenuManager() {
		return mainHelpMenu;
	}

	/**
	 * @see org.eclipse.ui.application.ActionBarAdvisor#fillCoolBar(ICoolBarManager
	 *      coolBar)
	 */
	protected void fillCoolBar(ICoolBarManager coolBar) {
		if (PlatformUI.getWorkbench().isClosing())
			return;
		coolBar.add(createFileToolbar(coolBar));
	}

	/**
	 * Creates the File menu.
	 */
	protected MenuManager createFileMenu(IMenuManager menuBar) {
		MenuManager fileMenu = new MenuManager(
				RCPUIResources.fileMenuItem_text,
				IWorkbenchActionConstants.M_FILE);
		fileMenu.add(new GroupMarker(IWorkbenchActionConstants.FILE_START));

		// Create the New sub menu, using the same id for it as the New action.
		String newText = RCPUIResources.fileNewMenuItem_text;
		String newId = ActionFactory.NEW.getId();
		MenuManager newMenu = new MenuManager(newText, newId) {
			public String getMenuText() {
				return super.getMenuText();
			}
		};
		newMenu.add(new Separator(newId));
		newMenu.add(new NewWizardMenu(getWindow(), null));
		newMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
		fileMenu.add(newMenu);
		fileMenu.add(new GroupMarker(IWorkbenchActionConstants.NEW_EXT));

		fileMenu.add(new Separator());
		MenuManager openSubMenu = new MenuManager(
				RCPUIResources.fileOpenMenuItem_text,
				IWorkbenchActionConstants.OPEN_EXT);
		openSubMenu
				.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
		openSubMenu.add(new Separator());
		fileMenu.add(openSubMenu);

		fileMenu.add(closeAction);
		fileMenu.add(closeAllAction);
		fileMenu.add(new Separator());
		fileMenu.add(saveAction);
		fileMenu.add(saveAsAction);
		fileMenu.add(saveAllAction);
		fileMenu.add(revertAction);
		fileMenu.add(new Separator());
		fileMenu.add(moveAction);
		fileMenu.add(renameAction);
		fileMenu.add(refreshAction);
		fileMenu.add(new Separator());
		fileMenu.add(importAction);
		fileMenu.add(exportAction);
		fileMenu.add(new Separator());
		fileMenu.add(propertiesAction);
		fileMenu.add(new Separator());
		fileMenu.add(exitAction);
		fileMenu.add(new GroupMarker(IWorkbenchActionConstants.FILE_END));

		return fileMenu;
	}

	/**
	 * Creates the Edit menu.
	 */
	protected MenuManager createEditMenu(IMenuManager menuBar) {
		MenuManager editMenu = new MenuManager(
				RCPUIResources.editMenuItem_text,
				IWorkbenchActionConstants.M_EDIT);
		editMenu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_START));
		editMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
		editMenu.add(new Separator());
		editMenu.add(new GroupMarker("opengroup")); //$NON-NLS-1$
		editMenu.add(openElementAction);
		editMenu.add(cutAction);
		editMenu.add(copyAction);
		editMenu.add(pasteAction);
		editMenu.add(new Separator());
		editMenu.add(deleteAction);
		editMenu.add(selectAllAction);
		editMenu.add(new Separator());
		editMenu.add(findAction);
		editMenu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_END));
		return editMenu;
	}

	/**
	 * Creates the Navigate menu.
	 */
	protected MenuManager createNavigateMenu(IMenuManager menuBar) {
		MenuManager navMenu = new MenuManager(
				RCPUIResources.navigateMenuItem_text,
				IWorkbenchActionConstants.M_NAVIGATE);
		navMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
		navMenu.add(goIntoAction);
		navMenu.add(new Separator());
		navMenu.add(nextAction);
		navMenu.add(previousAction);
		navMenu.add(new Separator());
		navMenu.add(backAction);
		navMenu.add(forwardAction);
		navMenu.add(new GroupMarker(IWorkbenchActionConstants.WB_END));
		return navMenu;
	}

	/**
	 * Creates the Window menu.
	 */
	protected MenuManager createWindowMenu(IMenuManager menuBar) {
		MenuManager windowMenu = new MenuManager(
				RCPUIResources.windowMenuItem_text,
				IWorkbenchActionConstants.M_WINDOW);
		windowMenu.add(new GroupMarker(IWorkbenchActionConstants.WB_START));
		windowMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));

		MenuManager changePerspMenuMgr = new MenuManager(
				RCPUIResources.windowOpenPerspectiveMenuItem_text,
				"openPerspective"); //$NON-NLS-1$
		IContributionItem changePerspMenuItem = ContributionItemFactory.PERSPECTIVES_SHORTLIST
				.create(getWindow());
		changePerspMenuMgr.add(changePerspMenuItem);
		windowMenu.add(changePerspMenuMgr);
		MenuManager showViewMenuMgr = new MenuManager(
				RCPUIResources.windowShowViewMenuItem_text, "showView"); //$NON-NLS-1$
		IContributionItem showViewMenu = ContributionItemFactory.VIEWS_SHORTLIST
				.create(getWindow());
		showViewMenuMgr.add(showViewMenu);
		windowMenu.add(showViewMenuMgr);

		windowMenu.add(new Separator());
		windowMenu.add(customizePerspectiveAction);
		windowMenu.add(savePerspectiveAction);
		windowMenu.add(resetPerspectiveAction);
		windowMenu.add(closePerspectiveAction);
		windowMenu.add(closeAllPerspectiveAction);
		windowMenu.add(new Separator());
		windowMenu.add(preferencesAction);
		windowMenu.add(new GroupMarker(IWorkbenchActionConstants.WB_END));
		return windowMenu;
	}

	protected void createInternalMenu(final IMenuManager helpMmenu) {
		internalMenu = new MenuManager(
				RCPUIResources.mainActionBarAdvisor_Diagnosis, ""); //$NON-NLS-1$

		internalMenu.add(new Action(
				RCPUIResources.mainActionBarAdvisor_HealthCheck) {
			public void run() {
				ViewHelper.checkLibraryHealth();
			}
		});
	}

	/**
	 * Creates the Help menu.
	 */
	protected MenuManager createHelpMenu(IMenuManager menuBar) {
		MenuManager helpMmenu = new MenuManager(
				RCPUIResources.helpMenuItem_text,
				IWorkbenchActionConstants.M_HELP);
		helpMmenu.add(new GroupMarker(IWorkbenchActionConstants.HELP_START));
		helpMmenu.add(welcomeAction);

		helpMmenu.add(new Separator());
		helpMmenu.add(helpContentsAction);
		helpMmenu.add(new GroupMarker("group.help")); //$NON-NLS-1$

		helpMmenu.add(new Separator());
		helpMmenu.add(new GroupMarker("group.assist")); //$NON-NLS-1$

		helpMmenu.add(new Separator());
		helpMmenu.add(new GroupMarker("group.tools")); //$NON-NLS-1$

		helpMmenu.add(new Separator());
		helpMmenu.add(new GroupMarker("group.updates")); //$NON-NLS-1$

		// Menu items for internal tool
		helpMmenu.add(new Separator());
		helpMmenu.add(new GroupMarker("group.internal")); //$NON-NLS-1$
		createInternalMenu(helpMmenu);

		helpMmenu.add(new Separator());
		helpMmenu.add(aboutAction);
		helpMmenu.add(new GroupMarker(IWorkbenchActionConstants.HELP_END));

		return helpMmenu;
	}

	/**
	 * Creates the File toolbar.
	 */
	protected IToolBarManager createFileToolbar(ICoolBarManager coolBar) {
		IActionBarConfigurer2 actionBarConfigurer = (IActionBarConfigurer2) getActionBarConfigurer();
		IMenuManager popUpMenu = new MenuManager();
		popUpMenu.add(new ActionContributionItem(lockToolBarAction));
		popUpMenu.add(new ActionContributionItem(editActionSetAction));
		coolBar.setContextMenuManager(popUpMenu);

		coolBar.add(new GroupMarker(IIDEActionConstants.GROUP_FILE));
		IToolBarManager fileToolBar = actionBarConfigurer
				.createToolBarManager();
		fileToolBar.add(new Separator(IWorkbenchActionConstants.NEW_GROUP));
		fileToolBar.add(newWizardDropDownAction);
		fileToolBar.add(new GroupMarker(IWorkbenchActionConstants.NEW_EXT));
		fileToolBar.add(new GroupMarker(IWorkbenchActionConstants.SAVE_GROUP));
		fileToolBar.add(saveAction);
		fileToolBar.add(saveAllAction);
		fileToolBar.add(new GroupMarker(IWorkbenchActionConstants.SAVE_EXT));
		fileToolBar.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));

		return fileToolBar;
	}

	/**
	 * Create a custom open perspective dialog
	 * 
	 * @param window
	 * @return
	 */
	protected IWorkbenchAction createTNGOpenPerspectiveDialogAction(
			IWorkbenchWindow window) {
		if (window == null) {
			throw new IllegalArgumentException();
		}
		IWorkbenchAction action = new UIOpenPerspectiveDialogAction(window);
		action.setId("openPerspectiveDialog"); //$NON-NLS-1$
		return action;
	}

}
