/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.debug.ui.snippeteditor;


import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;
import org.eclipse.jdt.internal.ui.javaeditor.BasicCompilationUnitEditorActionContributor;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchActionConstants;

/**
 * Contributions of the Java Snippet Editor to the Workbench's tool and menu bar.
 */
public class SnippetEditorActionContributor extends BasicCompilationUnitEditorActionContributor {

	protected JavaSnippetEditor fSnippetEditor;

	private StopAction fStopAction;
	private SelectImportsAction fSelectImportsAction;
	private SnippetOpenOnSelectionAction fOpenOnSelectionAction;
	private SnippetOpenHierarchyOnSelectionAction fOpenOnTypeSelectionAction;

	public SnippetEditorActionContributor() {
		super();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(org.eclipse.jface.action.IToolBarManager)
	 */
	@Override
	public void contributeToToolBar(IToolBarManager toolBarManager) {

		if (fStopAction == null) {
			toolBarManager.add(new Separator(IJavaDebugUIConstants.EVALUATION_GROUP));
			return;
		}
		toolBarManager.add(fStopAction);
		toolBarManager.add(fSelectImportsAction);
		toolBarManager.update(false);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(org.eclipse.jface.action.IMenuManager)
	 */
	@Override
	public void contributeToMenu(IMenuManager menu) {
		if (fOpenOnSelectionAction == null) {
			return;
		}
		super.contributeToMenu(menu);

		IMenuManager navigateMenu= menu.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);
		if (navigateMenu != null) {
			navigateMenu.appendToGroup(IWorkbenchActionConstants.OPEN_EXT, fOpenOnSelectionAction);
			navigateMenu.appendToGroup(IWorkbenchActionConstants.OPEN_EXT, fOpenOnTypeSelectionAction);
			navigateMenu.setVisible(true);
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IEditorActionBarContributor#setActiveEditor(org.eclipse.ui.IEditorPart)
	 */
	@Override
	public void setActiveEditor(IEditorPart part) {

		super.setActiveEditor(part);
		fSnippetEditor= null;
		if (part instanceof JavaSnippetEditor) {
			fSnippetEditor= (JavaSnippetEditor) part;
			if (fOpenOnSelectionAction == null) {
				initializeActions();
				contributeToMenu(getActionBars().getMenuManager());
				contributeToToolBar(getActionBars().getToolBarManager());
			}
		}

		if (fOpenOnSelectionAction != null) {
			fStopAction.setEditor(fSnippetEditor);
			fSelectImportsAction.setEditor(fSnippetEditor);
			fOpenOnSelectionAction.setEditor(fSnippetEditor);
			fOpenOnTypeSelectionAction.setEditor(fSnippetEditor);
		}

		updateStatus(fSnippetEditor);
	}

	protected void initializeActions() {

		fOpenOnSelectionAction= new SnippetOpenOnSelectionAction(fSnippetEditor);
		fOpenOnTypeSelectionAction= new SnippetOpenHierarchyOnSelectionAction(fSnippetEditor);
		fStopAction= new StopAction(fSnippetEditor);

		fSelectImportsAction= new SelectImportsAction(fSnippetEditor);
		if (fSnippetEditor.getFile() == null) {
			fSelectImportsAction.setEnabled(false);
		}
	}

	protected void updateStatus(JavaSnippetEditor editor) {
		String message= ""; //$NON-NLS-1$
		if (editor != null && editor.isEvaluating()) {
			message= SnippetMessages.getString("SnippetActionContributor.evalMsg");  //$NON-NLS-1$
		}
		getActionBars().getStatusLineManager().setMessage(message);
	}
}
