/******************************************************************************* * Copyright (c) 2009 SpringSource, a divison of VMware, Inc. * 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: * SpringSource, a division of VMware, Inc. - initial API and implementation *******************************************************************************/ 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 (fCorrectionAssist != null) { editMenu.appendToGroup(IContextMenuConstants.GROUP_GENERATE, fCorrectionAssist); } if (fContentAssist != null) { editMenu.appendToGroup(IContextMenuConstants.GROUP_GENERATE, fContentAssist); } } } @Override public void contributeToToolBar(IToolBarManager toolBarManager) { super.contributeToToolBar(toolBarManager); if (fHyperlinkAction != null) { toolBarManager.add(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 (fCorrectionAssist != null) { fCorrectionAssist.setAction(getAction(textEditor, ITextEditorActionConstants.QUICK_ASSIST)); } if (fHyperlinkAction != null) { fHyperlinkAction.setTextEditor(textEditor); } if (fFormatAction != null) { fFormatAction.setTextEditor(textEditor); } if (fContentAssist != null) { fContentAssist.setAction(getAction(textEditor, "ContentAssist")); //$NON-NLS-1$ } } } public AbstractPdeFormTextEditorContributor(String menuName) { super(menuName); fSourceContributor = createSourceContributor(); if (supportsCorrectionAssist()) { fCorrectionAssist = new RetargetTextEditorAction(PDESourcePage.getBundleForConstructedKeys(), "CorrectionAssistProposal."); //$NON-NLS-1$ fCorrectionAssist.setActionDefinitionId(ITextEditorActionDefinitionIds.QUICK_ASSIST); } if (supportsHyperlinking()) { fHyperlinkAction = new SpringHyperlinkAction(); fHyperlinkAction.setActionDefinitionId(IJavaEditorActionDefinitionIds.OPEN_EDITOR); } if (supportsFormatAction()) { fFormatAction = new ManifestFormatAction(); fFormatAction.setActionDefinitionId(PDEActionConstants.DEFN_FORMAT); } if (supportsContentAssist()) { fContentAssist = new RetargetTextEditorAction(PDESourcePage.getBundleForConstructedKeys(), "ContentAssistProposal."); //$NON-NLS-1$ 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 fSourceContributor; } @Override public void init(IActionBars bars) { super.init(bars); fSourceActionBars = new SubActionBars(bars); fSourceContributor.init(fSourceActionBars); } @Override public void dispose() { fSourceActionBars.dispose(); fSourceContributor.dispose(); super.dispose(); } protected void setSourceActionBarsActive(boolean active) { IActionBars rootBars = getActionBars(); rootBars.clearGlobalActionHandlers(); rootBars.updateActionBars(); if (active) { fSourceActionBars.activate(); Map handlers = 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 { fSourceActionBars.deactivate(); registerGlobalActionHandlers(); } rootBars.setGlobalActionHandler(PDEActionConstants.OPEN, active ? fHyperlinkAction : null); rootBars.setGlobalActionHandler(PDEActionConstants.FORMAT, active ? 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 (fEditor == null) { return; } IFormPage oldPage = fPage; fPage = fEditor.getActivePageInstance(); if (fPage == null) { return; } // Update the quick outline action to the navigate menu updateQuickOutlineMenuEntry(); updateActions(); if (oldPage != null && !oldPage.isEditor() && !fPage.isEditor()) { getActionBars().updateActionBars(); return; } boolean isSourcePage = fPage instanceof PDESourcePage; if (isSourcePage && fPage.equals(oldPage)) { return; } fSourceContributor.setActiveEditor(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 ((fPage instanceof PDEProjectionSourcePage) == false) { return; } PDEProjectionSourcePage page = (PDEProjectionSourcePage) 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 fHyperlinkAction; } protected ManifestFormatAction getFormatAction() { return fFormatAction; } class SpringHyperlinkAction extends HyperlinkAction { @Override public void generateActionText() { String text = PDEUIMessages.HyperlinkActionNoLinksAvailable; if (fLink instanceof BundleHyperlink) { text = PDEUIMessages.HyperlinkActionOpenPackage; setText(text); setToolTipText(text); } else { super.generateActionText(); } } } }