/*******************************************************************************
 * Copyright (c) 2000, 2017 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
 *
 *******************************************************************************/
package org.eclipse.dltk.internal.ui.editor;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;

import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.internal.ui.editor.selectionaction.GoToNextPreviousMemberAction;
import org.eclipse.dltk.ui.actions.DLTKActionConstants;
import org.eclipse.dltk.ui.actions.IScriptEditorActionDefinitionIds;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.actions.RetargetAction;
import org.eclipse.ui.texteditor.BasicTextEditorActionContributor;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.eclipse.ui.texteditor.RetargetTextEditorAction;

/**
 * Common base class for action contributors for Script editors.
 */
public class BasicScriptEditorActionContributor extends
		BasicTextEditorActionContributor {

	private List fPartListeners = new ArrayList();

	private RetargetTextEditorAction fGotoMatchingBracket;
	private RetargetTextEditorAction fShowOutline;
	private RetargetTextEditorAction fOpenHierarchy;

	private RetargetAction fRetargetShowScriptDoc;
	private RetargetTextEditorAction fShowScriptDoc;

	private RetargetTextEditorAction fGotoNextMemberAction;
	private RetargetTextEditorAction fGotoPreviousMemberAction;

	private RetargetTextEditorAction fRetargetShowInformationAction;

	public BasicScriptEditorActionContributor() {
		super();

		ResourceBundle b = DLTKEditorMessages.getBundleForConstructedKeys();

		fRetargetShowInformationAction = new RetargetTextEditorAction(b,
				"Editor.ShowInformation."); //$NON-NLS-1$
		fRetargetShowInformationAction
				.setActionDefinitionId(ITextEditorActionDefinitionIds.SHOW_INFORMATION);

		fRetargetShowScriptDoc = new RetargetAction(
				DLTKActionConstants.SHOW_DOCUMENTAION,
				DLTKEditorMessages.ShowScriptDoc_label);
		fRetargetShowScriptDoc
				.setActionDefinitionId(IScriptEditorActionDefinitionIds.SHOW_DOCUMENTATION);
		markAsPartListener(fRetargetShowScriptDoc);
		fShowScriptDoc = new RetargetTextEditorAction(b, "ShowDocumentation."); //$NON-NLS-1$
		fShowScriptDoc
				.setActionDefinitionId(IScriptEditorActionDefinitionIds.SHOW_DOCUMENTATION);

		fGotoMatchingBracket = new RetargetTextEditorAction(b,
				"GotoMatchingBracket."); //$NON-NLS-1$
		fGotoMatchingBracket
				.setActionDefinitionId(IScriptEditorActionDefinitionIds.GOTO_MATCHING_BRACKET);

		fShowOutline = new RetargetTextEditorAction(
				DLTKEditorMessages.getBundleForConstructedKeys(),
				"ShowOutline."); //$NON-NLS-1$
		fShowOutline
				.setActionDefinitionId(IScriptEditorActionDefinitionIds.SHOW_OUTLINE);

		fOpenHierarchy = new RetargetTextEditorAction(
				DLTKEditorMessages.getBundleForConstructedKeys(),
				"OpenHierarchy."); //$NON-NLS-1$
		fOpenHierarchy
				.setActionDefinitionId(IScriptEditorActionDefinitionIds.OPEN_HIERARCHY);

		fGotoNextMemberAction = new RetargetTextEditorAction(b,
				"GotoNextMember."); //$NON-NLS-1$
		fGotoNextMemberAction
				.setActionDefinitionId(IScriptEditorActionDefinitionIds.GOTO_NEXT_MEMBER);
		fGotoPreviousMemberAction = new RetargetTextEditorAction(b,
				"GotoPreviousMember."); //$NON-NLS-1$
		fGotoPreviousMemberAction
				.setActionDefinitionId(IScriptEditorActionDefinitionIds.GOTO_PREVIOUS_MEMBER);

	}

	protected final void markAsPartListener(RetargetAction action) {
		fPartListeners.add(action);
	}

	@Override
	public void init(IActionBars bars, IWorkbenchPage page) {
		Iterator e = fPartListeners.iterator();
		while (e.hasNext())
			page.addPartListener((RetargetAction) e.next());

		super.init(bars, page);

		bars.setGlobalActionHandler(DLTKActionConstants.SHOW_DOCUMENTAION,
				fShowScriptDoc);
	}

	@Override
	public void contributeToMenu(IMenuManager menu) {
		super.contributeToMenu(menu);

		IMenuManager editMenu = menu
				.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
		if (editMenu != null) {

			MenuManager structureSelection = new MenuManager(
					DLTKEditorMessages.ExpandSelectionMenu_label,
					"expandSelection"); //$NON-NLS-1$
			editMenu.insertAfter(ITextEditorActionConstants.SELECT_ALL,
					structureSelection);

			editMenu.appendToGroup(
					ITextEditorActionConstants.GROUP_INFORMATION,
					fRetargetShowInformationAction);
		}

		IMenuManager navigateMenu = menu
				.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);
		if (navigateMenu != null) {
			try {
				navigateMenu.appendToGroup(IWorkbenchActionConstants.SHOW_EXT,
						fShowOutline);
				navigateMenu.appendToGroup(IWorkbenchActionConstants.SHOW_EXT,
						fOpenHierarchy);
			} catch (IllegalArgumentException e) {
				if (DLTKCore.DEBUG) {
					e.printStackTrace();
				}
			}
		}

		IMenuManager gotoMenu = menu.findMenuUsingPath("navigate/goTo"); //$NON-NLS-1$
		if (gotoMenu != null) {
			gotoMenu.add(new Separator("additions2")); //$NON-NLS-1$
			gotoMenu.appendToGroup("additions2", fGotoPreviousMemberAction); //$NON-NLS-1$
			gotoMenu.appendToGroup("additions2", fGotoNextMemberAction); //$NON-NLS-1$
			gotoMenu.appendToGroup("additions2", fGotoMatchingBracket); //$NON-NLS-1$
		}
	}

	@Override
	public void setActiveEditor(IEditorPart part) {

		super.setActiveEditor(part);

		ITextEditor textEditor = null;
		if (part instanceof ITextEditor)
			textEditor = (ITextEditor) part;

		fShowOutline.setAction(getAction(textEditor,
				IScriptEditorActionDefinitionIds.SHOW_OUTLINE));
		fOpenHierarchy.setAction(getAction(textEditor,
				IScriptEditorActionDefinitionIds.OPEN_HIERARCHY));
		fGotoMatchingBracket.setAction(getAction(textEditor,
				GotoMatchingBracketAction.GOTO_MATCHING_BRACKET));

		fGotoNextMemberAction.setAction(getAction(textEditor,
				GoToNextPreviousMemberAction.NEXT_MEMBER));
		fGotoPreviousMemberAction.setAction(getAction(textEditor,
				GoToNextPreviousMemberAction.PREVIOUS_MEMBER));

		fRetargetShowInformationAction.setAction(getAction(textEditor,
				ITextEditorActionConstants.SHOW_INFORMATION));

		if (part instanceof ScriptEditor) {
			ScriptEditor editor = (ScriptEditor) part;
			editor.getActionGroup().fillActionBars(getActionBars());
			final ActionGroup foldingActions = editor.getFoldingActionGroup();
			if (foldingActions != null)
				foldingActions.updateActionBars();
		}

		IActionBars actionBars = getActionBars();
		IStatusLineManager manager = actionBars.getStatusLineManager();
		manager.setMessage(null);
		manager.setErrorMessage(null);

		/** The global actions to be connected with editor actions */
		IAction action = getAction(textEditor, ITextEditorActionConstants.NEXT);
		actionBars.setGlobalActionHandler(
				ITextEditorActionDefinitionIds.GOTO_NEXT_ANNOTATION, action);
		actionBars.setGlobalActionHandler(ITextEditorActionConstants.NEXT,
				action);
		action = getAction(textEditor, ITextEditorActionConstants.PREVIOUS);
		actionBars
				.setGlobalActionHandler(
						ITextEditorActionDefinitionIds.GOTO_PREVIOUS_ANNOTATION,
						action);
		actionBars.setGlobalActionHandler(ITextEditorActionConstants.PREVIOUS,
				action);
	}

	@Override
	public void dispose() {

		Iterator e = fPartListeners.iterator();
		while (e.hasNext())
			getPage().removePartListener((RetargetAction) e.next());
		fPartListeners.clear();

		setActiveEditor(null);
		super.dispose();
	}
}
