org.erlide.ui.information.PresenterControlCreator.java Source code

Java tutorial

Introduction

Here is the source code for org.erlide.ui.information.PresenterControlCreator.java

Source

/*******************************************************************************
 * Copyright (c) 2009 * 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:
 *     *
 *******************************************************************************/
package org.erlide.ui.information;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ToolBarManager;
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.core.erlang.ErlModelException;
import org.erlide.core.erlang.ErlangCore;
import org.erlide.core.erlang.IErlElement;
import org.erlide.jinterface.util.ErlLogger;
import org.erlide.ui.ErlideUIPlugin;
import org.erlide.ui.ErlideUIPluginImages;
import org.erlide.ui.actions.OpenAction;
import org.erlide.ui.editors.erl.ErlangEditor;
import org.erlide.ui.editors.erl.SimpleSelectionProvider;
import org.erlide.ui.editors.util.EditorUtility;
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 erlang.OpenResult;

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 Javadoc 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(ErlideUIPluginImages.DESC_OBJS_EDOCTAG);
        }

        /*
         * @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 ErlangEditor editor;

        public OpenDeclarationAction(final BrowserInformationControl infoControl, final ErlangEditor editor) {
            fInfoControl = infoControl;
            this.editor = editor;
            setText("Open declaration");
            ErlideUIPluginImages.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 {
                        OpenAction.openOpenResult(editor, editor.getModule(),
                                ErlangCore.getBackendManager().getIdeBackend(), -1, null, or);
                    } catch (final Exception e) {
                        e.printStackTrace();
                    }
                }
            } catch (final PartInitException e) {
                e.printStackTrace();
            } catch (final ErlModelException e) {
                e.printStackTrace();
            }
        }
    }

    private final ErlangEditor editor;

    public PresenterControlCreator(final ErlangEditor 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 iControl = new BrowserInformationControl(parent, font, tbm);

            final PresenterControlCreator.BackAction backAction = new PresenterControlCreator.BackAction(iControl);
            backAction.setEnabled(false);
            tbm.add(backAction);
            final PresenterControlCreator.ForwardAction forwardAction = new PresenterControlCreator.ForwardAction(
                    iControl);
            tbm.add(forwardAction);
            forwardAction.setEnabled(false);

            final PresenterControlCreator.ShowInEdocViewAction showInEdocViewAction = new PresenterControlCreator.ShowInEdocViewAction(
                    iControl);
            tbm.add(showInEdocViewAction);
            final PresenterControlCreator.OpenDeclarationAction openDeclarationAction = new PresenterControlCreator.OpenDeclarationAction(
                    iControl, editor);
            tbm.add(openDeclarationAction);

            final SimpleSelectionProvider selectionProvider = new SimpleSelectionProvider();
            // OpenExternalBrowserAction openExternalJavadocAction = new
            // OpenExternalBrowserAction(
            // parent.getDisplay(), selectionProvider);
            // selectionProvider
            // .addSelectionChangedListener(openExternalJavadocAction);
            // selectionProvider.setSelection(new
            // StructuredSelection());
            // tbm.add(openExternalJavadocAction);

            final IInputChangedListener inputChangeListener = new IInputChangedListener() {
                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);
                    }
                }
            };
            iControl.addInputChangeListener(inputChangeListener);

            tbm.update(true);

            return iControl;
        } else {
            return new DefaultInformationControl(parent, EditorsUI.getTooltipAffordanceString(),
                    new ErlInformationPresenter(true));
        }
    }
}