package org.erlide.ui.internal.information; import org.eclipse.jface.action.Action; import org.eclipse.ui.PartInitException; import org.erlide.engine.model.IErlElement; import org.erlide.engine.services.search.OpenResult; import org.erlide.ui.ErlideImage; import org.erlide.ui.actions.OpenUtils; import org.erlide.ui.editors.erl.AbstractErlangEditor; import org.erlide.ui.editors.util.EditorUtility; import org.erlide.ui.internal.ErlBrowserInformationControlInput; import org.erlide.ui.util.eclipse.text.BrowserInformationControl; import org.erlide.ui.views.EdocView; import org.erlide.util.ErlLogger; /** * Action that opens the current hover input element. * * @since 3.4 */ public final class OpenDeclarationAction extends Action { private final BrowserInformationControl fInfoControl; private final EdocView edocView; public OpenDeclarationAction(final BrowserInformationControl infoControl, final AbstractErlangEditor editor) { fInfoControl = infoControl; edocView = null; setText("Open declaration"); ErlideImage.setLocalImageDescriptors(this, "goto_input.gif"); } public OpenDeclarationAction(final EdocView edocView) { this.edocView = edocView; fInfoControl = null; setText("Open declaration"); ErlideImage.setLocalImageDescriptors(this, "goto_input.gif"); } /* * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { ErlBrowserInformationControlInput input = null; if (fInfoControl != null) { input = (ErlBrowserInformationControlInput) fInfoControl.getInput(); fInfoControl.notifyDelayedInputChange(null); fInfoControl.dispose(); } else if (edocView != null) { input = edocView.getInput(); } if (input != null) { // TODO: add hover location to editor navigation history? try { final Object element = input.getInputElement(); if (element instanceof IErlElement) { EditorUtility.openElementInEditor(element, true); } else if (element instanceof OpenResult) { final OpenResult or = (OpenResult) element; try { final AbstractErlangEditor editor = input.getEditor(); new OpenUtils().openOpenResult(editor, editor.getModule(), -1, null, or, null); } catch (final Exception e) { ErlLogger.error(e); } } } catch (final PartInitException e) { ErlLogger.error(e); } } } }