/******************************************************************************* * Copyright (c) 2009-2013 Vlad Dumitrescu and others. * 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: * Vlad Dumitrescu *******************************************************************************/ package org.erlide.ui.internal.information; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.AbstractReusableInformationControlCreator; import org.eclipse.jface.text.DefaultInformationControl; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInputChangedListener; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.editors.text.EditorsUI; 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.erl.SimpleSelectionProvider; import org.erlide.ui.editors.util.EditorUtility; import org.erlide.ui.internal.ErlideUIPlugin; import org.erlide.ui.util.eclipse.text.BrowserInformationControl; import org.erlide.ui.util.eclipse.text.BrowserInformationControlInput; import org.erlide.ui.util.eclipse.text.BrowserInput; import org.erlide.ui.views.EdocView; import org.erlide.util.ErlLogger; public final class PresenterControlCreator extends AbstractReusableInformationControlCreator { /** * Action to go back to the previous input in the hover control. */ private static final class BackAction extends Action { private final BrowserInformationControl fInfoControl; public BackAction(final BrowserInformationControl infoControl) { fInfoControl = infoControl; setText("Previous"); final ISharedImages images = PlatformUI.getWorkbench().getSharedImages(); setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_BACK)); setDisabledImageDescriptor( images.getImageDescriptor(ISharedImages.IMG_TOOL_BACK_DISABLED)); update(); } @Override public void run() { final BrowserInformationControlInput previous = (BrowserInformationControlInput) fInfoControl .getInput().getPrevious(); if (previous != null) { fInfoControl.setInput(previous); } } public void update() { final BrowserInformationControlInput current = fInfoControl.getInput(); if (current != null && current.getPrevious() != null) { final BrowserInput previous = current.getPrevious(); setToolTipText(String.format("Go back to %s", previous.getInputName())); setEnabled(true); } else { setToolTipText(""); setEnabled(false); } } } /** * Action to go forward to the next input in the hover control. */ private static final class ForwardAction extends Action { private final BrowserInformationControl fInfoControl; public ForwardAction(final BrowserInformationControl infoControl) { fInfoControl = infoControl; setText("Next"); final ISharedImages images = PlatformUI.getWorkbench().getSharedImages(); setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_FORWARD)); setDisabledImageDescriptor( images.getImageDescriptor(ISharedImages.IMG_TOOL_FORWARD_DISABLED)); update(); } @Override public void run() { final BrowserInformationControlInput next = (BrowserInformationControlInput) fInfoControl .getInput().getNext(); if (next != null) { fInfoControl.setInput(next); } } public void update() { final BrowserInformationControlInput current = fInfoControl.getInput(); if (current != null && current.getNext() != null) { setToolTipText( String.format("Go to next %s", current.getNext().getInputName())); setEnabled(true); } else { setToolTipText(""); setEnabled(false); } } } /** * Action that shows the current hover contents in the Edoc view. */ private static final class ShowInEdocViewAction extends Action { private final BrowserInformationControl fInfoControl; public ShowInEdocViewAction(final BrowserInformationControl infoControl) { fInfoControl = infoControl; setText("Show in eDoc view"); setImageDescriptor(ErlideImage.OBJS_EDOCTAG.getDescriptor()); } /* * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { final BrowserInformationControlInput input = fInfoControl.getInput(); fInfoControl.notifyDelayedInputChange(null); fInfoControl.dispose(); try { final EdocView view = (EdocView) ErlideUIPlugin.getActivePage() .showView(EdocView.ID); // TODO view.setInput(infoInput); view.setText(input.getHtml()); } catch (final PartInitException e) { ErlLogger.error(e); } } } /** * Action that opens the current hover input element. * * @since 3.4 */ private static final class OpenDeclarationAction extends Action { private final BrowserInformationControl fInfoControl; private final AbstractErlangEditor editor; public OpenDeclarationAction(final BrowserInformationControl infoControl, final AbstractErlangEditor editor) { fInfoControl = infoControl; this.editor = editor; setText("Open declaration"); ErlideImage.setLocalImageDescriptors(this, "goto_input.gif"); } /* * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { final BrowserInformationControlInput infoInput = fInfoControl.getInput(); fInfoControl.notifyDelayedInputChange(null); fInfoControl.dispose(); // TODO: add hover location to editor navigation history? try { final Object element = infoInput.getInputElement(); if (element instanceof IErlElement) { EditorUtility.openElementInEditor(element, true); } else if (element instanceof OpenResult) { final OpenResult or = (OpenResult) element; try { new OpenUtils().openOpenResult(editor, editor.getModule(), -1, null, or, null); } catch (final Exception e) { ErlLogger.error(e); } } } catch (final PartInitException e) { ErlLogger.error(e); } } } private final AbstractErlangEditor editor; public PresenterControlCreator(final AbstractErlangEditor editor) { this.editor = editor; } @Override protected IInformationControl doCreateInformationControl(final Shell parent) { if (BrowserInformationControl.isAvailable(parent)) { final ToolBarManager tbm = new ToolBarManager(SWT.FLAT); final String font = JFaceResources.DIALOG_FONT; final BrowserInformationControl control = new BrowserInformationControl( parent, font, tbm); final PresenterControlCreator.BackAction backAction = new PresenterControlCreator.BackAction( control); backAction.setEnabled(false); tbm.add(backAction); final PresenterControlCreator.ForwardAction forwardAction = new PresenterControlCreator.ForwardAction( control); tbm.add(forwardAction); forwardAction.setEnabled(false); final PresenterControlCreator.ShowInEdocViewAction showInEdocViewAction = new PresenterControlCreator.ShowInEdocViewAction( control); tbm.add(showInEdocViewAction); if (editor != null) { final OpenDeclarationAction openDeclarationAction = new OpenDeclarationAction( control, editor); tbm.add(openDeclarationAction); final SimpleSelectionProvider selectionProvider = new SimpleSelectionProvider(); final OpenEdocInExternalBrowserAction openEdocInExternalBrowserAction = new OpenEdocInExternalBrowserAction( editor.getSite(), null); openEdocInExternalBrowserAction .setSpecialSelectionProvider(selectionProvider); selectionProvider .addSelectionChangedListener(openEdocInExternalBrowserAction); final ImageDescriptor descriptor = ErlideImage.OBJS_EXTERNALBROWSER .getDescriptor(); openEdocInExternalBrowserAction.setImageDescriptor(descriptor); openEdocInExternalBrowserAction.setDisabledImageDescriptor(descriptor); selectionProvider.setSelection(new StructuredSelection()); tbm.add(openEdocInExternalBrowserAction); // OpenExternalBrowserAction openExternalJavadocAction = new // OpenExternalBrowserAction( // parent.getDisplay(), selectionProvider); // selectionProvider // .addSelectionChangedListener(openExternalJavadocAction); // selectionProvider.setSelection(new // StructuredSelection()); // tbm.add(openExternalJavadocAction); final IInputChangedListener inputChangeListener = new IInputChangedListener() { @Override public void inputChanged(final Object newInput) { backAction.update(); forwardAction.update(); if (newInput == null) { selectionProvider.setSelection(new StructuredSelection()); } else if (newInput instanceof BrowserInformationControlInput) { final BrowserInformationControlInput input = (BrowserInformationControlInput) newInput; final Object inputElement = input.getInputElement(); selectionProvider .setSelection(new StructuredSelection(inputElement)); final boolean hasInputElement = inputElement != null; showInEdocViewAction.setEnabled(hasInputElement); openDeclarationAction.setEnabled(hasInputElement); openEdocInExternalBrowserAction.setInput(newInput); openEdocInExternalBrowserAction.setEnabled(hasInputElement); } } }; control.addInputChangeListener(inputChangeListener); } tbm.update(true); control.addLocationListener(new HandleEdocLinksLocationListener(control)); return control; } return new DefaultInformationControl(parent, EditorsUI.getTooltipAffordanceString(), new ErlInformationPresenter(true)); } }