blob: 49c0fe082633a8bd4c237b83a26413e809294c3a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
*******************************************************************************/
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();
}
}