blob: 58e9582d109fcfd34194a0551c38c55705557795 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2009, 2012 SpringSource, a division of VMware, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.ui.editors;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.jdt.ui.IContextMenuConstants;
import org.eclipse.jdt.ui.actions.IJavaEditorActionDefinitionIds;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.editor.PDEFormEditorContributor;
import org.eclipse.pde.internal.ui.editor.PDEProjectionSourcePage;
import org.eclipse.pde.internal.ui.editor.PDESourcePage;
import org.eclipse.pde.internal.ui.editor.actions.HyperlinkAction;
import org.eclipse.pde.internal.ui.editor.actions.PDEActionConstants;
import org.eclipse.pde.internal.ui.editor.text.BundleHyperlink;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.SubActionBars;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.editors.text.TextEditorActionContributor;
import org.eclipse.ui.forms.editor.IFormPage;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.eclipse.ui.texteditor.RetargetTextEditorAction;
import org.eclipse.virgo.ide.ui.internal.actions.ManifestFormatAction;
/**
* @author Christian Dupuis
*/
public class AbstractPdeFormTextEditorContributor extends PDEFormEditorContributor {
protected RetargetTextEditorAction fCorrectionAssist;
protected HyperlinkAction fHyperlinkAction;
protected ManifestFormatAction fFormatAction;
protected RetargetTextEditorAction fContentAssist;
protected final TextEditorActionContributor fSourceContributor;
protected SubActionBars fSourceActionBars;
protected class PDETextEditorActionContributor extends TextEditorActionContributor {
@Override
public void contributeToMenu(IMenuManager mm) {
super.contributeToMenu(mm);
IMenuManager editMenu = mm.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
if (editMenu != null) {
editMenu.add(new Separator(IContextMenuConstants.GROUP_OPEN));
editMenu.add(new Separator(IContextMenuConstants.GROUP_GENERATE));
editMenu.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS));
if (AbstractPdeFormTextEditorContributor.this.fCorrectionAssist != null) {
editMenu.appendToGroup(IContextMenuConstants.GROUP_GENERATE, AbstractPdeFormTextEditorContributor.this.fCorrectionAssist);
}
if (AbstractPdeFormTextEditorContributor.this.fContentAssist != null) {
editMenu.appendToGroup(IContextMenuConstants.GROUP_GENERATE, AbstractPdeFormTextEditorContributor.this.fContentAssist);
}
}
}
@Override
public void contributeToToolBar(IToolBarManager toolBarManager) {
super.contributeToToolBar(toolBarManager);
if (AbstractPdeFormTextEditorContributor.this.fHyperlinkAction != null) {
toolBarManager.add(AbstractPdeFormTextEditorContributor.this.fHyperlinkAction);
}
}
@Override
public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
IActionBars actionBars = getActionBars();
IStatusLineManager manager = actionBars.getStatusLineManager();
manager.setMessage(null);
manager.setErrorMessage(null);
ITextEditor textEditor = part instanceof ITextEditor ? (ITextEditor) part : null;
if (AbstractPdeFormTextEditorContributor.this.fCorrectionAssist != null) {
AbstractPdeFormTextEditorContributor.this.fCorrectionAssist.setAction(getAction(textEditor, ITextEditorActionConstants.QUICK_ASSIST));
}
if (AbstractPdeFormTextEditorContributor.this.fHyperlinkAction != null) {
AbstractPdeFormTextEditorContributor.this.fHyperlinkAction.setTextEditor(textEditor);
}
if (AbstractPdeFormTextEditorContributor.this.fFormatAction != null) {
AbstractPdeFormTextEditorContributor.this.fFormatAction.setTextEditor(textEditor);
}
if (AbstractPdeFormTextEditorContributor.this.fContentAssist != null) {
AbstractPdeFormTextEditorContributor.this.fContentAssist.setAction(getAction(textEditor, "ContentAssist")); //$NON-NLS-1$
}
}
}
public AbstractPdeFormTextEditorContributor(String menuName) {
super(menuName);
this.fSourceContributor = createSourceContributor();
if (supportsCorrectionAssist()) {
this.fCorrectionAssist = new RetargetTextEditorAction(PDESourcePage.getBundleForConstructedKeys(), "CorrectionAssistProposal."); //$NON-NLS-1$
this.fCorrectionAssist.setActionDefinitionId(ITextEditorActionDefinitionIds.QUICK_ASSIST);
}
if (supportsHyperlinking()) {
this.fHyperlinkAction = new SpringHyperlinkAction();
this.fHyperlinkAction.setActionDefinitionId(IJavaEditorActionDefinitionIds.OPEN_EDITOR);
}
if (supportsFormatAction()) {
this.fFormatAction = new ManifestFormatAction();
this.fFormatAction.setActionDefinitionId(PDEActionConstants.DEFN_FORMAT);
}
if (supportsContentAssist()) {
this.fContentAssist = new RetargetTextEditorAction(PDESourcePage.getBundleForConstructedKeys(), "ContentAssistProposal."); //$NON-NLS-1$
this.fContentAssist.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
}
}
public boolean supportsCorrectionAssist() {
return false;
}
public boolean supportsContentAssist() {
return false;
}
public boolean supportsFormatAction() {
return false;
}
public boolean supportsHyperlinking() {
return false;
}
@Override
public IEditorActionBarContributor getSourceContributor() {
return this.fSourceContributor;
}
@Override
public void init(IActionBars bars) {
super.init(bars);
this.fSourceActionBars = new SubActionBars(bars);
this.fSourceContributor.init(this.fSourceActionBars);
}
@Override
public void dispose() {
this.fSourceActionBars.dispose();
this.fSourceContributor.dispose();
super.dispose();
}
protected void setSourceActionBarsActive(boolean active) {
IActionBars rootBars = getActionBars();
rootBars.clearGlobalActionHandlers();
rootBars.updateActionBars();
if (active) {
this.fSourceActionBars.activate();
Map handlers = this.fSourceActionBars.getGlobalActionHandlers();
if (handlers != null) {
Set keys = handlers.keySet();
for (Iterator iter = keys.iterator(); iter.hasNext();) {
String id = (String) iter.next();
rootBars.setGlobalActionHandler(id, (IAction) handlers.get(id));
}
}
} else {
this.fSourceActionBars.deactivate();
registerGlobalActionHandlers();
}
rootBars.setGlobalActionHandler(PDEActionConstants.OPEN, active ? this.fHyperlinkAction : null);
rootBars.setGlobalActionHandler(PDEActionConstants.FORMAT, active ? this.fFormatAction : null);
// Register the revert action
rootBars.setGlobalActionHandler(ActionFactory.REVERT.getId(), getRevertAction());
rootBars.updateActionBars();
}
protected void registerGlobalActionHandlers() {
registerGlobalAction(ActionFactory.DELETE.getId());
registerGlobalAction(ActionFactory.UNDO.getId());
registerGlobalAction(ActionFactory.REDO.getId());
registerGlobalAction(ActionFactory.CUT.getId());
registerGlobalAction(ActionFactory.COPY.getId());
registerGlobalAction(ActionFactory.PASTE.getId());
registerGlobalAction(ActionFactory.SELECT_ALL.getId());
registerGlobalAction(ActionFactory.FIND.getId());
}
protected void registerGlobalAction(String id) {
IAction action = getGlobalAction(id);
getActionBars().setGlobalActionHandler(id, action);
}
@Override
public void setActivePage(IEditorPart newEditor) {
if (this.fEditor == null) {
return;
}
IFormPage oldPage = this.fPage;
this.fPage = this.fEditor.getActivePageInstance();
if (this.fPage == null) {
return;
}
// Update the quick outline action to the navigate menu
updateQuickOutlineMenuEntry();
updateActions();
if (oldPage != null && !oldPage.isEditor() && !this.fPage.isEditor()) {
getActionBars().updateActionBars();
return;
}
boolean isSourcePage = this.fPage instanceof PDESourcePage;
if (isSourcePage && this.fPage.equals(oldPage)) {
return;
}
this.fSourceContributor.setActiveEditor(this.fPage);
setSourceActionBarsActive(isSourcePage);
}
/**
*
*/
protected void updateQuickOutlineMenuEntry() {
// Get the main action bar
IActionBars actionBars = getActionBars();
IMenuManager menuManager = actionBars.getMenuManager();
// Get the navigate menu
IMenuManager navigateMenu = menuManager.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);
// Ensure there is a navigate menu
if (navigateMenu == null) {
return;
}
// Remove the previous version of the quick outline menu entry - if
// one exists
// Prevent duplicate menu entries
// Prevent wrong quick outline menu from being brought up for the wrong
// page
navigateMenu.remove(PDEActionConstants.COMMAND_ID_QUICK_OUTLINE);
// Ensure the active page is a source page
// Only add the quick outline menu to the source pages
if (this.fPage instanceof PDEProjectionSourcePage == false) {
return;
}
PDEProjectionSourcePage page = (PDEProjectionSourcePage) this.fPage;
// Only add the action if the source page supports it
if (page.isQuickOutlineEnabled() == false) {
return;
}
// Get the appropriate quick outline action associated with the active
// source page
IAction quickOutlineAction = page.getAction(PDEActionConstants.COMMAND_ID_QUICK_OUTLINE);
// Ensure it is defined
if (quickOutlineAction == null) {
return;
}
// Add the quick outline action after the "Show In" menu contributed
// by JDT
// This could break if JDT changes the "Show In" menu ID
try {
navigateMenu.insertAfter("showIn", quickOutlineAction); //$NON-NLS-1$
} catch (IllegalArgumentException e) {
// Ignore
}
}
protected TextEditorActionContributor createSourceContributor() {
return new PDETextEditorActionContributor();
}
protected HyperlinkAction getHyperlinkAction() {
return this.fHyperlinkAction;
}
protected ManifestFormatAction getFormatAction() {
return this.fFormatAction;
}
class SpringHyperlinkAction extends HyperlinkAction {
@Override
public void generateActionText() {
String text = PDEUIMessages.HyperlinkActionNoLinksAvailable;
if (this.fLink instanceof BundleHyperlink) {
text = PDEUIMessages.HyperlinkActionOpenPackage;
setText(text);
setToolTipText(text);
} else {
super.generateActionText();
}
}
}
}