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 class SelectEnclosingAction extends Action { private UniversalEditor fEditor; private INavigationTargetFinder fNavTargetFinder; public SelectEnclosingAction() { this(null); } public SelectEnclosingAction(UniversalEditor editor) { super("Select Enclosing"); setActionDefinitionId(UniversalEditor.SELECT_ENCLOSING_COMMAND); setEditor(editor); } 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 enclosing= fNavTargetFinder.getEnclosingConstruct(curNode, pc.getCurrentAst()); if (enclosing != null) { int enclOffset= locator.getStartOffset(enclosing); int enclEnd= locator.getEndOffset(enclosing); fEditor.selectAndReveal(enclOffset, enclEnd - enclOffset + 1); } } }