| /******************************************************************************* |
| * Copyright (c) 2020 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: |
| * Ari Kast - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ui.texteditor; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionProvider; |
| |
| import org.eclipse.jface.text.Position; |
| import org.eclipse.jface.text.TextSelection; |
| |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IEditorSite; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.IWorkbenchWindowActionDelegate; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.internal.texteditor.EditPosition; |
| import org.eclipse.ui.internal.texteditor.TextEditorPlugin; |
| |
| |
| /** |
| * Goes to next edit position, ie travels forward in the edit position history |
| * Acts as a complement to GotoLastEditPositionAction which travels backward in |
| * the history. |
| * |
| * @since 3.15 |
| */ |
| public class GotoNextEditPositionAction extends Action implements IWorkbenchWindowActionDelegate { |
| |
| /** The workbench window */ |
| private IWorkbenchWindow fWindow; |
| /** The action */ |
| private IAction fAction; |
| |
| /** |
| * Creates a goto next edit action. |
| */ |
| public GotoNextEditPositionAction() { |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(this, |
| IAbstractTextEditorHelpContextIds.GOTO_NEXT_EDIT_POSITION_ACTION); |
| setId(ITextEditorActionDefinitionIds.GOTO_NEXT_EDIT_POSITION); |
| setActionDefinitionId(ITextEditorActionDefinitionIds.GOTO_NEXT_EDIT_POSITION); |
| setEnabled(false); |
| } |
| |
| @Override |
| public void init(IWorkbenchWindow window) { |
| fWindow= window; |
| } |
| |
| @Override |
| public void run(IAction action) { |
| run(); |
| } |
| |
| @Override |
| public void run() { |
| if (TextEditorPlugin.TraversalDirection.FORWARD == TextEditorPlugin.getDefault() |
| .getEditHistoryTraversalDirection()) { |
| TextEditorPlugin.getDefault().advanceEditPosition(); |
| } |
| EditPosition editPosition = TextEditorPlugin.getDefault().getNextEditPosition(); |
| try { |
| |
| if (editPosition == null) |
| return; |
| |
| final Position pos = editPosition.getPosition(); |
| if (pos == null || pos.isDeleted) |
| return; |
| |
| IWorkbenchWindow window = getWindow(); |
| if (window == null) |
| return; |
| |
| IWorkbenchPage page = window.getActivePage(); |
| |
| IEditorPart editor; |
| try { |
| editor = page.openEditor(editPosition.getEditorInput(), editPosition.getEditorId()); |
| } catch (PartInitException ex) { |
| IStatus status = new Status(IStatus.ERROR, TextEditorPlugin.PLUGIN_ID, IStatus.OK, |
| "Go to Next Edit Location failed", ex); //$NON-NLS-1$ |
| TextEditorPlugin.getDefault().getLog().log(status); |
| return; |
| } |
| |
| // Optimization - could also use else branch |
| if (editor instanceof ITextEditor) { |
| ITextEditor textEditor = (ITextEditor) editor; |
| textEditor.selectAndReveal(pos.offset, pos.length); |
| return; |
| } |
| |
| /* |
| * Workaround: send out a text selection XXX: Needs to be improved, |
| * see https://bugs.eclipse.org/bugs/show_bug.cgi?id=32214 |
| */ |
| if (editor != null) { |
| IEditorSite site = editor.getEditorSite(); |
| if (site == null) |
| return; |
| |
| ISelectionProvider provider = editor.getEditorSite().getSelectionProvider(); |
| if (provider == null) |
| return; |
| |
| provider.setSelection(new TextSelection(pos.offset, pos.length)); |
| } |
| } finally { |
| TextEditorPlugin.getDefault() |
| .setEditHistoryTraversalDirection(TextEditorPlugin.TraversalDirection.FORWARD); |
| } |
| } |
| |
| @Override |
| public void selectionChanged(IAction action, ISelection selection) { |
| boolean enabled= TextEditorPlugin.getDefault().getLastEditPosition() != null; |
| setEnabled(enabled); |
| action.setEnabled(enabled); |
| |
| // This is no longer needed once the action is enabled. |
| if (!enabled) { |
| // adding the same action twice has no effect. |
| TextEditorPlugin.getDefault().addLastEditPositionDependentAction(action); |
| // this is always the same action for this instance |
| fAction = action; |
| } |
| } |
| |
| /** |
| * Returns the workbench window. |
| * |
| * @return the workbench window |
| */ |
| private IWorkbenchWindow getWindow() { |
| if (fWindow == null) |
| fWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| return fWindow; |
| } |
| |
| @Override |
| public void dispose() { |
| fWindow= null; |
| TextEditorPlugin.getDefault().removeLastEditPositionDependentAction(fAction); |
| } |
| } |