/******************************************************************************* * Copyright (c) 2009 IBM Corporation. * 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: * Robert Fuhrer (rfuhrer@watson.ibm.com) - initial API and implementation *******************************************************************************/ package org.eclipse.imp.editor; import org.eclipse.imp.language.ServiceFactory; import org.eclipse.imp.parser.IParseController; import org.eclipse.imp.parser.ISourcePositionLocator; import org.eclipse.imp.services.INavigationTargetFinder; import org.eclipse.jface.action.Action; import org.eclipse.jface.text.IRegion; import org.eclipse.ui.texteditor.ITextEditor; public abstract class TargetNavigationAction extends Action { protected UniversalEditor fEditor; protected INavigationTargetFinder fNavTargetFinder; protected abstract Object getNavTarget(Object o, Object astRoot); protected TargetNavigationAction(String title, String actionDefID) { this(null, title, actionDefID); } public TargetNavigationAction(UniversalEditor editor, String title, String actionDefID) { setEditor(editor); setText(title); setActionDefinitionId(actionDefID); } public void setEditor(ITextEditor editor) { fNavTargetFinder= null; if (editor instanceof UniversalEditor) { fEditor= (UniversalEditor) editor; if (fEditor.fLanguage != null) { fNavTargetFinder= ServiceFactory.getInstance().getNavigationTargetFinder(fEditor.fLanguage); } } else { fEditor= null; } setEnabled(fNavTargetFinder != null); } @Override public void run() { IRegion selection= fEditor.getSelectedRegion(); IParseController pc= fEditor.getParseController(); ISourcePositionLocator locator= pc.getSourcePositionLocator(); Object curNode= locator.findNode(pc.getCurrentAst(), selection.getOffset(), selection.getOffset() + selection.getLength() - 1); if (curNode == null || selection.getOffset() == 0) { curNode= pc.getCurrentAst(); } Object prev= getNavTarget(curNode, pc.getCurrentAst()); if (prev != null) { int prevOffset= locator.getStartOffset(prev); fEditor.selectAndReveal(prevOffset, 0); } } }